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

代码的思路是:先假设前两个元素为最大和第二大,然后遍历数组,如果遇到比当前最大值更大的数,就更新最大值和第二大值;如果遇到介于当前最大值和第二大值之间的数,就更新第二大值。

不过代码中存在一个潜在问题:当数组的前两个元素中,第一个元素就是最大值时,初始的max2可能不是正确的第二大值。例如输入序列为10, 5, 8, ...,初始max1=10, max2=5,遍历到8时,8大于5但小于10,会正确更新max2为8。但如果输入序列为10, 9, 8, ...,初始max1=10, max2=9,遍历到8时,8不大于9,不会更新,结果正确。但如果输入序列为10, 3, 9, ...,初始max1=10, max2=3,遍历到9时,9大于3且小于10,会更新max2为9,结果正确。但如果输入序列为10, 10, 5, ...,初始max1=10, max2=10,遍历到5时,5不大于10,不会更新,但此时最大两个数都是10,和应为20,而代码中max2=10,结果正确。但如果输入序列为5, 10, 8, ...,初始max1=5, max2=10,遍历到10时,10大于5,会更新max1=10, max2=5,然后遍历到8时,8大于5且小于10,更新max2=8,结果正确。

实际上,更常见的问题出现在:如果所有数都相等,比如全部是7,初始max1=7, max2=7,遍历时没有数大于7,max2保持7,和是14,正确。但如果数组只有两个不同数,且第一个是最大值,第二个是第二大值,初始设置正确。但如果第一个是第二大值,第二个是最大值,初始max1=第二大值, max2=最大值,遍历到最大值时,最大值大于max1,会更新max1=最大值, max2=第二大值,正确。

所以这段代码在大多数情况下能工作,但有一个边界情况:如果最大值出现在第一个位置,而第二大值