在线编译器 C

#include <stdio.h> int main() { int n = 10; int a[10]; int max1, max2; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } max1 = a[0]; max2 = a[0]; for (int i = 0; i < n; i++) { if (a[i] > max1) { max1 = a[i]; } } for (int i = 0; i < n; i++) { if (a[i] > max2 || a[i] != max1) { max2 = a[i]; } } int sum = max1 + max2; printf("%d", sum); return 0; }
这段代码的目的是从10个整数中找出最大的两个数,并计算它们的和。但代码中存在逻辑错误,导致结果可能不正确。

- 在初始化时,`max1`和`max2`都设为`a[0]`,这会导致如果最大的数出现在第一个位置,`max2`可能无法正确找到第二大的数。
- 第二个循环的条件 `a[i] > max2 || a[i] != max1` 逻辑有误。当遇到与`max1`相等的数时,即使它比`max2`小,也会被错误地赋值给`max2`,而且如果所有数都相等,`max2`会保持为`a[0]`,导致结果错误。

- 思考如何正确追踪最大的两个数:可以遍历数组时同时更新`max1`和`max2`,或者先找到最大值,再在剩余数中找第二大值。注意处理重复值的情况。