c语言:如果有一大堆数,怎么找出其中出现次数最多的那个

作者&投稿:谯俘 (若有异议请与网页底部的电邮联系)
c语言:如果有一大堆数,怎么找出其中出现次数最多的那个~

开两个数组,一个存放读入的数,一个存放计数,
用循环读入每一个数,
如果数组中不存在这个数,就放入数组,计数为1;
如果数组中存在这个数,计数加1;
然后找出计数最大的那个数。

#include
int main()
{
int n,i,j,k,t,m,a[25];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;//先进行排序,按从小到大的顺序依次排列,排列须引入中间量t。
}
}
}
t=a[0];
m=1;
k=1; //t记录当前出现次数最多的数,m记录t出现的次数,k记录当前数出现的次数,
for(i=1;i<n;i++)
{
if(a[i]!=a[i-1])//如果前后两数不相等了
{
if(k>m)//只出现一遍则不会有k>m,由于m不断更新,值会变大,所以不一定会有k>m反复
{
m=k;//如果k>m了,m变大,保证m是出现次数最多的数的次数
t=a[i-1];//m由k赋值,k代表的是a【i-1】
}
k=1;//新的数字k重新变为1,再循环,不然k会一直变大,使得m也改变
}
else
k++;//前后两数相等,k即次数增加
}
if(k>m)//循环最后进行更新,不然如果最后一项次数最多,无法输出最后一项
{
m=k;
t=a[i-1];
}
printf("%d
",t);
}
return 0;
}

扩展资料:
数组使用规则:
1.可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
2.只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:static int a[10]=1。
3.如不给可初始化的数组赋初值,则全部元素均为0值。
4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:static int a[5]={1,2,3,4,5};可写为:static int a[]={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
参考资料:
百度百科-数组

数据结构:用一个可变长度的动态结构数组(结构类型中有两个成员,一是被统计的数,另一是这个数出现的频次),或用两个整形数组,或动态表。

算法思路:

  1. 对于每个要统计的数,首先看是不是已存在于数组中,如果在,其对应的频次数加1;如果不在,添在数组中,频次数为1。

  2. 由于这一大堆数的组成是未知的(如,有100个数,其中3有10个,9有80个,54有10个,那么结果只要用数组中的三个元素就保存了,频次最高的是9;但也有另一种可能:1~100中每个数都出现一次,那就要100个元素了),同时这一大堆数的总个数也是未知的,所以要考虑可变长度的动态存储结构,首选就是动态链表了。当然也可以考虑动态数组,一开始数组有个初始大小(如100),运行时如果不够大,则在原数组大小基础上增加一定长度(如100)建立新数组,将原数组复制到新数组,删除原数组。

  3. 统计完成后,在数组中查找频次最大的元素即可。

 

下述参考程序,用结构数组实现。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <memory.h>

struct Node {
    int item; //数据
    int freq; //出现次数
};

struct List {
    struct Node* data;
    int occupied; //被占用的数
    int size; //空间总数
};

void statistic(struct List* , int );
struct Node maxFreq(struct List*);

 

void main() {

    //准备数据结构并初始化
    struct List dataList;
    dataList.data =(struct Node*) malloc(100 * sizeof (struct Node));
    memset(dataList.data, 0, 100 * sizeof (struct Node));
    dataList.size = 100;
    dataList.occupied = 0;

    /*开始统计*/
    srand((unsigned) time(NULL)); //初始化随机数

    int i;

    int d;

    for (i = 0; i < 1000; i++) { //生成1000个50以内的随机数
        d = rand() % 50;
        //printf(" %d
", d ); //打印
        //统计每个数出现的频度
        statistic(&dataList, d);
    }
    struct Node result=maxFreq(&dataList);
    free(dataList.data);
    printf("出现频度最大的数:%d,出现次数:%d",result.item,result.freq);
}

void statistic(struct List *list, int d) {
    int i = 0;
    for (; i < list->occupied; i++) {
        if (list->data[i].item == d) {
            list->data[i].freq += 1;    //数据已在表,频度加1
            return;
        }
    }
    //数据不在表中
    if (i >= list->occupied) {
        if (list->size <= list->occupied) {      //空间不够
            list->size+=100;//增加100个空间;
            struct Node *temp= malloc(list->size * sizeof (struct Node));
            memcpy(temp,list->data,list->occupied * sizeof (struct Node));
            free(list->data);
            memset(&(list->data[list->occupied]),0, 100 * sizeof (struct Node));
        }
        list->data[list->occupied].item = d;
        list->data[list->occupied].freq += 1;
        list->occupied++;
    }
}
struct Node maxFreq(struct List* list){

    struct Node temp;
    temp.freq=list->data[0].freq;
    temp.item=list->data[0].item;
    int i=1;
    for (; i < list->occupied; i++) {
        if (temp.freq<list->data[i].freq){
            temp.freq=list->data[i].freq;
            temp.item=list->data[0].item;
        }
    }
    return temp;
}



开两个数组,一个存放读入的数,一个存放计数,
用循环读入每一个数,
如果数组中不存在这个数,就放入数组,计数为1;
如果数组中存在这个数,计数加1;
然后找出计数最大的那个数。


俞敏洪《我曾走在崩溃的边缘》8句人生箴言,值得一听
一件事做得很顺利并不能叫作成功;如果面对一大堆失败的尸骨,你还敢挺胸昂头向前走,这才叫成功。所以,大家要记住,成功是没有止境的。 目前整个 社会 对成功的看法是很浅薄的。当人们有钱的时候,没有人会问这个钱是怎么来的,只会觉得有钱就是成功,所以富豪榜出来后,如果你在榜上,人们或多或少会认为你这...

兄弟有事没事常来电话 是那首歌的歌词
飞机起飞了 没有祝福没有告别 就这么走了 也是 你就这德性 给你准备的东西 你也不说拿走 是怕哥几个把你绑了不让你走 是吧 在那边儿好好的 把自己照顾好了 缺点儿什么就和哥几个说 你别扛着 要是真想回来 你就赶快麻利儿回来 小子 这边儿还有一大堆事儿等着你弄呢 在这边儿的家人有事儿...

积累词语对写作文的重要性
收集积累的材料如一大堆干柴,须有灵感的火花才能点燃;收集积累的材料如一大堆花粉,须经蜜蜂的酝酿才能成蜜;收集积累的材料也如一袋米,须经巧妇加工才能成为香喷喷的米饭。 因此,酝酿——构思的过程就是对材料的整理取舍融合的过程,构思成熟自然会产生灵感——久积胸中之情迫切需要渲泄,不吐不快的瞬间冲动。有心者...

“爱斯基摩人”真的有多少个词来形容雪?
这个问题有三个答案:一大堆,没那么多,一大堆。或者,如果您需要详细信息:5、2 和至少 99。那是因为没有单一的“爱斯基摩”语言。对于生活在阿拉斯加、加拿大、格陵兰和西伯利亚极地地区的因纽特人和尤皮克人来说,爱斯基摩人是一个松散的术语,通常被认为是冒犯性的。他们讲多种语言,最常见的语言是...

python和c++哪个更值得学
C++的性能非常优异,可以处理大规模的数据和复杂的计算,C++也是一些著名游戏引擎的主要编程语言。因此,如果你想从事数据分析、人工智能、机器学习等领域,或者想进行快速的开发,可以学习Python,Python的需求量也较高。如果你想从事系统编程、图形界面设计、嵌入式系统开发等领域,或者对底层知识有热情,可以...

编程语言学什么好
2、读大一零基础学编程上学习编程的首要任务是学习电脑的基础操作,熟悉键盘,让自己对电脑有初步的了解认识。至于理工科专业的学生大一估计都会教《计算机科学导论》这样类似的课程,如果想尽快编程,学生应尽快将该书内容看一遍,让自己对计算机有一个整体的认识。那么大一学生若要系统的学习 C语言,建议...

求易语言图片识别的方法或者 源码 谢谢 有分 瞎打的别来 不给分_百度...
假设已经把验证码图片保存到本地了 验证码识别的大致步骤 1,读取图片到bitmap 2,进行灰度操作 3,进行才二值操作 4,如果有干扰点 一般用滤波器或八邻域去干扰点 5,如果有干扰线 如果是简单的直线可以用扫描法,八后法等,复杂的应该根据特点调整算法 6,如果有干扰色块 也应该想法去除 7,如果...

把一大堆想说的话 用很简短的一句话说出来 打4个字的成语 该怎么说_百 ...
(二)~和“一针见血”;都有“语言简短明确”的意思。但~重在意思完备;“一针见血”重在指出要害。(三)~和“言简意少”都含有“语言简洁”的意思。但“言简意少”中的“意少”表示思想内容缺乏;~中的“意赅”表示内容充实。【例句】(1)我们做报告时切勿长篇大论;应~。(2)我们写...

易语言如何查找文件夹!并且把文件释放到这个目录,还有怎样一大堆...
释放?还是不太明白.如果是把一堆文件保存到指定文件夹:.子程序 移动到文件夹 .参数 _文件夹, 文本型 .参数 _文件列表, 文本型, 数组 .局部变量 a, 整数型 .如果真 (取文本右边 (_文件夹, 1) ≠ “\\”)_文件夹 = _文件夹 + “\\”.如果真结束 .计次循环首 (取数组成员数 (_文件...

...平时不爱说话 可一说就一大堆废话 连自己的话都不解 何况别人 什么...
说明你内心里还是想说,想向其他人表达你的情感,只是在说的过程中,可能语言的组织或者逻辑思维有点不清晰,感觉比较混乱,说到这又联想到那,结果越扯越远,自己都拉不回来了,多说是好事,以后说的时候尽量整理下思路比较好!

四子王旗19487082801: c语言:如果有一大堆数,怎么找出其中出现次数最多的那个 -
邬古盐酸: 数据结构:用一个可变长度的动态结构数组(结构类型中有两个成员,一是被统计的数,另一是这个数出现的频次),或用两个整形数组,或动态表.算法思路: 1. 对于每个要统计的数,首先看是不是已存在于数组中,如果在,其对应的频次...

四子王旗19487082801: 用C语言找众数 -
邬古盐酸: 1、先将数组a[N]排序(增序、降序都可以) 2、从a[i++]开始统计,若相等则计数器b[j++],如此重复. 3、在b[N]查找最大数max,并记录max在b[N]中的索引imax 4、设置标志flag = 1,若满足(b[i] == max && i != imax),则flag = 0 5、若falg = ...

四子王旗19487082801: c语言中如何从一大堆数据中筛选最大的 -
邬古盐酸: 1.把这“一大堆”数放进一个数组. 2.把数组的第一个元素看作最大数赋给变量max. 3.从数组的第二个元素开始与max比较,若元素值比max大则把这个元素值赋给max. 4.遍历后max则为最大的.

四子王旗19487082801: 在C语言中怎样从一堆数中找到最大和最小的数? -
邬古盐酸: 数组,可以在定义数组的时候直接输入一堆

四子王旗19487082801: 在很大的一个数组 找一个数? -
邬古盐酸: 你可以先将数组按它内容大小分块,比如内容在1-10000的为一块,10001-20000的为一块,把这些划好块的数组的地址再给一个指针数组保存,用时根据你要找的数的大小直接去用这些指针找就行了,比如找1,因为1在1-10000,直接去 指针[1] 挨个找就行了.

四子王旗19487082801: 怎样用c语言在n个数中找出最多的那个数 -
邬古盐酸: 分两步 1 统计每个数出现的次数. 2 找出次数最大值.建议可以使用一个辅助数组 来进行统计.

四子王旗19487082801: c语言编程,一维数组,从数组中找数 -
邬古盐酸: #include <stdio.h> #define N 10 int main() {int arr[N];int n;int i;int flag;for (i = 0; i < N; i++){printf("请输入第%d个元素", i + 1);scanf("%d", &arr[i]);} while (1){flag = 0;printf("请输入要查找的n的值:");scanf("%d", &n); ...

四子王旗19487082801: 在一个数组中查找一个数,用C语言怎么写代码? -
邬古盐酸: main() {int a[10];int i,find;bool result;bool find_num(int b[],int j);for(i=0;i<10+i++)scanf("%d",a[i]);/* 输入数组 */scanf("%d",find);/*输入要查找的数*/result=find_num(a,find);if (result==0)printf("the number isnot find\n"); ...

四子王旗19487082801: 编写C语言程序从n个数中找出其中最大的数?急急急... -
邬古盐酸: int GetMax(int *a, int n) {int iMax = a[0];int i = 0;for (i = 0; i < n; i++){if (a[i] > iMax)iMax = a[i];}return iMax; } int main(void) {int a[10] = {1,5,20, 22, 34,3,53,23,5, 9};printf("max data is %d", GetMax(a, 10)); }

四子王旗19487082801: C语言如何实现1堆数字找出出现次数最多的数字
邬古盐酸: 加计数器和选择次数

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网