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;
用循环读入每一个数,
如果数组中不存在这个数,就放入数组,计数为1;
如果数组中存在这个数,计数加1;
然后找出计数最大的那个数。本回答被提问者和网友采纳
有一万条字符串,要找出前10条出现次数最多的,该如何解决
可以用group by 分组汇总,通过count()函数统计重复次数,然后对重复次数进行倒序去前十
oracle 写法
select 字段名称,cfcountfrom (select 字段名称,count(1) as cfcount
from 表名 group by 字段名称 order by count(1) desc) a
where rownum<=10
sql server 写法
select top 10 字段名称,cfcountfrom (select 字段名称,count(1) as cfcount
from 表名 group by 字段名称 order by count(1) desc) a 参考技术A 分组统计数量 ,再按数量降序排,取前10个就可以了
以上是关于c语言:如果有一大堆数,怎么找出其中出现次数最多的那个的主要内容,如果未能解决你的问题,请参考以下文章