Онлайн компилятор C

#include <stdio.h> enum{size=10}; int main() { int A[size]; for(int i=0;i<size;i++){ scanf("%d",&A[i]); } int max1=0,max2=0,sum; max1=A[0]; max2=A[1]; sum=0; for(int i=0;i<size;i++){ if(A[i]>max1&&A[i]>max2){ max2=max1; max1=A[i]; } if(max1>A[i]&&A[i]>max2){ max2=A[i]; } } sum=max1+max2; printf("%d",sum); return 0; }
这段代码的目的是从10个整数中找出最大的两个数,并计算它们的和。代码整体思路正确,但存在一个逻辑问题。

- 初始化 `max1` 和 `max2` 时,直接用了 `A[0]` 和 `A[1]`,但并没有保证 `A[0]` 一定大于 `A[1]`。如果 `A[0]` 小于 `A[1]`,那么 `max1` 和 `max2` 的初始值就反了,可能导致后续比较出错。
- 在循环中,第一个 `if` 条件 `A[i]>max1 && A[i]>max2` 其实可以简化,因为如果 `A[i]` 大于 `max1`,它自然也会大于 `max2`(假设 `max1` 是当前最大值)。但这里更关键的是,当 `A[i]` 大于 `max1` 时,需要把旧的 `max1` 赋给 `max2`,然后更新 `max1`,这个逻辑是对的。不过第二个 `if` 条件 `max1>A[i] && A[i]>max2` 在 `A[i]` 等于 `max1` 或 `max2` 时不会更新,这符合只找严格大于的情况,但要注意如果所有数都相等,`max2` 可能永远不会被正确更新。