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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言:如果有一大堆数,怎么找出其中出现次数最多的那个相关的知识,希望对你有一定的参考价值。

c语言编程题:如果有一大堆数,怎么找出其中出现次数最多的那个?
请说一下编程思路什么吧,我想不出什么实现办法,我是新手,就说哈有啥实现办法吧
我等会儿自己在vc上练练。
请大神给个思路吧。。。

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

算法思路:

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

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

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

 

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

#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\\n", 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;

参考技术A 开两个数组,一个存放读入的数,一个存放计数,
用循环读入每一个数,
如果数组中不存在这个数,就放入数组,计数为1;
如果数组中存在这个数,计数加1;
然后找出计数最大的那个数。本回答被提问者和网友采纳

有一万条字符串,要找出前10条出现次数最多的,该如何解决

可以用group by 分组汇总,通过count()函数统计重复次数,然后对重复次数进行倒序去前十

oracle 写法

select 字段名称,cfcount
from (select 字段名称,count(1) as cfcount
from 表名 group by 字段名称 order by count(1) desc) a
where rownum<=10

sql server 写法

select top 10 字段名称,cfcount
from (select 字段名称,count(1) as cfcount
from 表名 group by 字段名称 order by count(1) desc) a

参考技术A 分组统计数量 ,再按数量降序排,取前10个就可以了

以上是关于c语言:如果有一大堆数,怎么找出其中出现次数最多的那个的主要内容,如果未能解决你的问题,请参考以下文章

有一万条字符串,要找出前10条出现次数最多的,该如何解决

在c#中找出一个数组中出现次数最多的元素,求各种方法,要详细的代码

如何获取数组中出现次数最多的字符串?

如何求出数组中出现次数最多的数字(C#实现)

CCF - 201312-1 - 出现次数最多的数

找出字符串中出现次数最多的字符和次数