在线编译器 C

#include <stdio.h> int main() { int a[10]; int m, n; for (int d = 0; d < 10; d++) { scanf("%d", &a[d]); } m = a[0]; n = a[1]; for (int d = 1; d < 10; d++) { if (a[d] > m) { m = a[d], n = m } if (m > a[d] && n < a[d]) { n = a[d] } } int c = m + n; printf("%d", c); return 0; }
这段代码试图找出数组中的最大值和第二大值,然后计算它们的和。但代码中存在逻辑错误,导致结果不正确。

- 在第一个if语句中,当找到新的最大值时,你同时更新了m和n,但这里n被赋值为旧的m,而旧的m可能并不是当前第二大的值。例如,如果数组是[5, 3, 4],当遇到4时,最大值m变成4,n被赋值为旧的m即5,但5已经不是数组中的元素了,这会导致错误。
- 第二个if语句的条件是m > a[d] && n < a[d],这个条件只在当前元素介于m和n之间时成立,但n的初始值是a[1],如果a[1]不是第二大值,这个条件可能永远不触发。而且你只考虑了元素比n大的情况,没有考虑元素比n小但可能是第二大值的情况(比如当n初始值过大时)。