先在0-10以内的数字找到其中重复次数最多数字
先让一个数组长度为十,让0到10的数字每出现一次就让数组中对应下标的数字加一
定义一个结构体让结构体定义一个整型一个保存现在出现次数最多的数字另一个保存出现最多数字的次数
定义结构体代码如下
typedef struct Hash
{
int num;
int times;
}Hash;
然后输出结构体中的代表 最多次数的数字 和 最多次数的数字的次数的两个值
代码如下
void GetMaxTimes0(int *arr,int len)
{
int brr[10] = {0};//数据出现的范围
Hash h = {0}; //保存出现次数最多的数字及次数
for(int i=0;i<len;i++)//遍历arr
{
brr[arr[i]]++;
}
for(int i=0;i<10;i++)//遍历brr
{
if(brr[i] > h.times)
{
h.num = i;
h.times = brr[i];
}
}
printf("数字=%d,次数=%d\n",h.num,h.times);
}
但是这只在小范围数字中才有效,如果数字范围太广遍历时间就会太长
可以通过哈希和归并来解决
哈希的除留余数 让遍历得到的数字余一个数等于这个数的放在一起比较 代码如下
void GetMaxTimes(int *arr,int len)
{
int brr[5] = {0};//数据出现的范围
Hash h0 = {0}; //保存出现偶数次数最多的数字及次数
Hash h1 = {0};//保存出现奇数次数最多的数字及次数
int i;
for(i=0;i<len;i++)//处理x%2 == 0的数据
{//0,2,4,6,8->0,1,2,3,4
if(arr[i]%2 == 0)
{
brr[arr[i]/2]++;
}
}
for(i=0;i<5;i++)
{
if(brr[i] > h0.times)
{
h0.times = brr[i];
h0.num = i*2;//将下标还原原有的数字
}
}
memset(brr,0,5*sizeof(int));
for(i=0;i<len;i++)//处理x%2 == 1的数据
{//1,3,5,7,9->0,1,2,3,4
if(arr[i]%2 != 0)
{
brr[arr[i]/2]++;
}
}
for(i=0;i<5;i++)
{
if(brr[i] > h1.times)
{
h1.times = brr[i];
h1.num = 2*i+1;
}
}
h0 = (h0.times>h1.times) ? h0 : h1;
printf("数字=%d,次数=%d\n",h0.num,h0.times);
}
或者可以把这些数字每几个放一起比较得出来的在进行比较 代码如下
void GetMaxTime(const char *path)
{
FILE *fr = fopen(path,"rb");
assert(fr != NULL);
int brr[10] = {0};
Hash h = {0,0};
int tmp;
while(fread(&tmp,sizeof(int),1,fr) > 0)//等同arr
{
brr[tmp]++;
}
for(int i=0;i<10;i++)
{
if(brr[i] > h.times)
{
h.num = i;
h.times = brr[i];
}
}
fclose(fr);
printf("数字=%d,次数=%d\n",h.num,h.times);
}
通过随机数来建立一个大小为一万的数字库
void CreateNum(const char *path) { FILE *fw = fopen(path,"wb"); assert(fw != NULL); int tmp; for(int i=0;i<NUM_SIZE;i++) { tmp = rand()%10; fwrite(&tmp,sizeof(int),1,fw); } fclose(fw); }