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

#include <stdio.h> int main() { int a[10]; int max1; int max2; int sum; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } max1 = a[0]; max2 = a[1]; if (max1 < max2) { max1 = a[1]; max2 = a[0]; } for (int i = 2; i < 10; i++) { if (a[i] >= max1) { max2 = max1; max1 = a[i]; } else if (a[i] > max2) { max2 = a[i]; } } sum = max1 + max2; printf("%d", sum); return 0; }
这段代码的功能是:读取10个整数,找出其中最大的两个数,并输出它们的和。

代码的思路是:先初始化max1和max2为前两个数,并确保max1是较大的那个。然后遍历剩余的数,如果当前数比max1大,就更新max1和max2;如果只比max2大,就只更新max2。最后输出两个最大数的和。

- 注意:如果数组中有重复的最大值,比如多个相同的最大值,代码会如何处理?考虑一下当a[i]等于max1时,条件a[i] >= max1会触发,这会把max1原来的值赋给max2,然后max1变成当前值。这样处理是否合理?如果所有数都相同,结果会是什么?
- 另外,如果输入的10个数中,前两个数恰好是最大的两个数,但顺序是max1较小、max2较大,那么初始的交换逻辑能正确工作吗?检查一下交换后max1和max2的值是否符合预期。