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

#include<stdio.h> int main() { int arr[10]; int i,j; int b=0; int n; for(i=0;i<10;i++){ scanf("%d",&arr[i]); } for(i=0;i<10;i++){ int a=0; for(j=0;j<10;j++){ if(arr[i]==arr[j]){ a++; } } if(a>b){ b=a; n=arr[i]; } } printf("%d",n); return 0; }
这段代码的功能是:从键盘输入10个整数,然后找出这10个数中出现次数最多的那个数,并输出它。

代码的基本思路是:用外层循环遍历每个数,内层循环统计该数在数组中出现的次数,如果某个数出现的次数比当前记录的最大次数还要大,就更新最大次数和对应的数值。

代码中存在一个逻辑问题。当数组中有多个不同的数出现次数相同且都是最大次数时,程序只会输出最先遇到的那个数。但更关键的是,如果数组中有重复的数,比如输入 1 1 2 2 3 3 4 4 5 5,每个数都出现两次,程序会输出第一个数 1,这可能是符合预期的。但问题在于,如果输入的数字中,某个数出现次数不是唯一的最高,比如 1 出现3次,2出现2次,3出现2次,程序会正确输出1。然而,如果输入的数字中,所有数都只出现一次,那么每个数的a都是1,b初始为0,所以第一个数会被记录,但后续每个数的a都等于b,不会更新,最终输出的是第一个数。这可能是合理的,但需要确认题目要求。

更值得注意的问题是:当数组中有多个数出现次数相同且都是最大时,你的代码只输出第一个遇到的。如果题目要求输出所有出现次数最多的数,那么代码需要修改。但根据你的代码,目前只输出一个。

- 检查内层循环中,当arr[i]等于arr[j]时,a++,但注意当i和j相等时也会计数,所以每个数至少出现1次。这是正确的。
- 考虑一下,如果输入的数字中,有两个不同的数出现次数相同且都是最高,比如 1 1 2 2 3,那么1和2都出现2次,你的代码会输出1。如果题目要求输出所有这样的数,你需要修改逻辑。但如果你只需要输出一个,那么代码基本正确,只是需要确认边界情况。