在线编译器 C

#include <stdio.h> int main() { int a[10]; int max1; int max2; int max3; int sum; int q=1; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } max1 = a[0]; for (int i = 0; i < 10; i++) { if (a[i] > max1) { max1 = a[i]; } } max2 = a[0]; max3 = a[0]; for (int i = 0; i < 10; i++) { if (a[i] > max3) { q=i; } a[q]=0; if (a[i] > max2) { max2 = a[i]; } } sum = max1 + max2; printf("%d ", sum); return 0; }
这段代码试图找出数组中最大的两个数并求和,但实现有逻辑错误。

代码先找出最大值max1,然后试图找出第二大值max2。但在第二个循环中,你试图通过将最大值位置置零来排除它,但操作顺序和条件判断有问题。

- 你只更新了q的值,但没有在每次比较时正确重置或使用它。当找到比max3大的元素时,你记录下标q,但之后立即将a[q]设为0,这可能会把之前已经处理过的元素也清零。
- 更关键的是,你同时用max3和max2两个变量,但逻辑混乱。实际上你只需要一个变量来记录第二大值,并且应该在排除最大值后重新遍历数组来寻找第二大值。

提示:
- 思考一下:找到最大值后,如何正确地“忽略”它来寻找第二大值?是否需要在找第二大值之前先把最大值的位置标记出来?
- 注意循环中a[q]=0这行代码的位置和条件。它每次循环都会执行,但可能不是在你想要的时候执行。