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=0;i<size;i++){ if(A[i]>=max1){ max1=A[i]; } else if(A[i]>max2){ max2=A[i]; } } sum=max1+max2; printf("%d",sum); return 0; }
这段代码的目的是从10个整数中找出最大的两个数并计算它们的和。代码的思路是遍历数组,维护当前最大的两个数,最后求和输出。

代码中存在一个逻辑错误:当遇到新的最大值时,原来的最大值应该变成第二大的值,但代码中只更新了max1,没有把旧的max1赋给max2。这会导致在某些情况下max2不是正确的第二大数。

- 提示1:考虑当A[i]大于max1时,除了更新max1,还需要处理原来的max1。原来的最大值应该成为新的第二大值。
- 提示2:初始时假设max1和max2分别是A[0]和A[1]并比较它们的大小,这个思路是对的。但在后续遍历中,如果A[i]只大于max2而不大于max1,更新max2是正确的;但如果A[i]大于max1,则必须同时更新max1和max2。