实验7-1-6 求一批整数中出现最多的个位数字 (20分)
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入格式:
输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
输出格式:
在一行中按格式“M: n1 n2 …”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
输入样例:
3
1234 2345 3456
输出样例:
3: 3 4
代码:
#include <stdio.h>
int main()
{
int n, i;
int b[10] = {0};//统计0~9这些数字出现的次数
//****************一定要把b数组初始化!!!不然会出错
int max;//次数的最大值
int index;//最大值的下标
int p;//每个数分离出来的最后一个数
scanf("%d", &n);
int a[n];
for(i = 0; i < n; i++ )//初始化数组
{
scanf("%d", &a[i]);
}
for(i = 0; i < n; i++ )//建立循环,以此记录从0~9的出现次数
{
p = a[i] % 10;
b[p]++;
a[i] = a[i]/10;
//为什么不直接把这三个语句放到while循环呢?因为如果b[i]是0的话,在while的判断条件里不符合,会忽略掉我所说的情况
//上一句话特别重要!!!!!!因为这点错误,我查了很多遍这个代码
while(a[i] != 0)
{
p = a[i] % 10;
b[p]++; //每分离出来一个数,就把b数组是这个数的位置加一
a[i] = a[i]/10;
}
}
// for(i = 0; i < 10; i++)
// {
// printf("测试:b[%d] = %d", i, b[i]);
// }
max = b[0];
index = 0;
//********************初始化max之后,一定也要把index初始化,不然出错!!!
// printf("测试:b[0] = %d", b[0]);
for(i = 0; i < 10; i++)//先找最大值
{
if(b[i] > max)
{
max = b[i];
index = i;
}
}
printf("%d: %d", max, index);
for(i = 0; i <10; i++ )//再找与最大值相等的数字
{
if(b[i] == max && i != index)
{
printf(" %d", i);
}
}
return 0;
}
作者想说:第二个循环,即记录从0~9的出现次数的循环中,如果直接把那三个语句放进while循环中,最后一个测试点会一直通不过,
如果测试的时候,输入:
1
0
就会发现问题。