解题思路:
首先,定义结构体数组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;
}


点赞(3)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论