在线编译器 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) { max2 = max1; max1 = a[i]; } else if (a[i] > max2) { max2 = a[i]; } } int sum = max1 + max2; printf("%d", sum); return 0; }
这段代码的功能是:读取10个整数,找出其中最大的两个数,并输出它们的和。

代码的逻辑是:先假设第一个元素既是最大值也是次大值,然后遍历数组,当遇到比当前最大值更大的数时,更新最大值和次大值;否则如果比当前次大值大,则更新次大值。

- 注意初始化的方式:`max1 = a[0]; max2 = a[0];` 这样如果所有数都相等,或者最大值出现在第一个位置,次大值会被错误地初始化为同一个值。考虑一下,如果数组是 `[5, 3, 2]`,第一次循环时 `max1` 和 `max2` 都是5,然后遇到3时,`a[i] > max1` 不成立,但 `a[i] > max2` 也不成立(因为3不大于5),所以次大值始终是5,结果会错误。

- 另外,如果数组元素全部相同,比如全是7,那么最终 `max1` 和 `max2` 都是7,它们的和是14,但实际应该只有7这一个数,没有第二个不同的最大值。需要思考如何处理这种边界情况。