左嘉


私信TA

用户名:zuojia

访问量:88573

签 名:

Jz

等  级
排  名 5
经  验 34534
参赛次数 226
文章发表 72
年  龄 40
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

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

  评论区

  • «
  • »