原题链接:众数问题
解题思路:
首先,定义结构体数组S,其中的元素不仅有值,还有该值在S中出现的次数。对于输入的每个自然数s,若其值在S中出现过,就令其出现的次数加1,若出现的次数比已知最大的重数多,就更新当前最大的重数;若s是新值,就以出现次数为1的状态添加到S中,使S中元素的个数加1;如此更新或添加,直到输入结束,找到众数的重数。
注意事项:
当有多个众数时,不仅要得到它出现的重数,而且要在集合S中寻找最小的众数。
参考代码:
#include<stdio.h>
#define N 50001
typedef struct SNum{
int s; //元素的值
int t; //元素在多重集合中出现的次数
}Num;
Num S[N];
int main(){
int n,s,i,v,m=0,c=0;
scanf("%d",&n);
while(n--){ //n行中
scanf("%d",&s); //每行一个自然数
for(i=0;i<c;i++){ //寻找集合S
if(s==S[i].s){ //若s在集合S中出现过
S[i].t++; //出现的次数加1
if(S[i].t>m) //若出现次数最多
m=S[i].t; //更新众数的重数
break;
}
}
if(i==c){ //若s在集合S中还未出现过
S[c].s=s; //将s添加到S中
S[c].t=1; //出现了1次
c++; //集合S中有c个元素
}
}
v=0x7fffffff;
for(i=0;i<c;i++){ //在集合S中寻找
if(S[i].t==m&&S[i].s<v) //最小的众数
v=S[i].s;
}
printf("%d\n%d\n",v,m);
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复