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

#include <stdio.h> int main() { int a[10]; int max=0; int res=0; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (int i = 0; i < 10; i++) { int c=1; for (int j = 0; j < 10; j++) { if (a[i] ==a[j]&&i!=j) c++; } if(c>max){ max=c; res=a[i]; } } printf("%d",res); return 0; }
这段代码的功能是:从键盘输入10个整数,然后找出其中出现次数最多的那个数,并输出它。如果多个数出现次数相同,它会输出最先达到最大次数的那个数。

代码逻辑基本正确,但有一个潜在问题需要注意:

- 当数组中有多个不同的数出现次数相同时,你的代码会输出最先遍历到的那个数,这可能是符合预期的。但更关键的是,如果所有数都只出现一次(即最大次数为1),你的代码会输出第一个数,这通常也是合理的。

不过,你的代码在初始化 `max=0` 时有一个边界情况:如果所有数都只出现一次,那么 `c=1` 会大于 `max=0`,所以第一个数会被选中,结果正确。但考虑一种情况:如果数组中的数都是负数,且出现次数相同,结果仍然正确。

- 你的代码中,内层循环 `for (int j = 0; j < 10; j++)` 会重复比较很多次,比如当 `i` 和 `j` 相等时跳过,但这样会多次统计同一个数。实际上,对于每个 `i`,你都在重新统计 `a[i]` 的出现次数,这会导致重复计算。例如,当 `i=0` 时统计了 `a[0]` 的次数,当 `i=1` 时如果 `a[1]` 等于 `a[0]`,又会重新统计一次。虽然最终结果可能正确,但效率较低。你可以思考如何避免这种重复统计。