Online Compiler C

#include <stdio.h> enum{size=10}; int main() { int A[size]; for(int i=0;i<size;i++){ scanf("%d",&A[i]); } int max1=A[0],max2=A[1],sum; if(A[1]>A[0]){ max1=A[1]; max2=A[0]; } sum=0; for(int i=2;i<size;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和max2时,直接用了A[0]和A[1],但没有考虑如果数组长度小于2的情况。不过这里size固定为10,所以不会出问题。但更关键的是,如果A[0]和A[1]相等,或者所有数字都相等,你的初始化逻辑可能无法正确得到最大值和次大值。比如输入全是5,你的代码会输出10,但实际应该输出5+5=10,这倒是正确的。但考虑输入是5,5,4,3,...,你的初始化会让max1=5, max2=5,然后遍历时因为后面的数都不大于5,所以max2始终是5,最终输出10,这没问题。但如果输入是5,4,5,3,...,初始化max1=5, max2=4,遍历到第二个5时,因为A[i]等于max1,不会进入第一个if,也不会进入第二个if(因为不大于max2),所以max2仍然是4,最终输出9,但实际最大的两个数是5和5,和应为10。这里有一个逻辑漏洞。

- 你的初始化部分用if判断交换了max1和max2,但之后遍历时,对于等于max1的情况没有处理。当新数字等于当前最大值时,它也应该成为新的次大值候选。