212
社区成员
发帖
与我相关
我的任务
分享
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入格式:输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
输出格式:在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
输入样例:
3
1234 2345 3456
输出样例:
3: 3 4
解题思路:本题需要对一批整数的每一位数字进行统计,而十进制的基础数字最多就十个,所以我们不妨设一个大小为10的数组来进行统计,数组下标即代表十个数字,该下标位置上的元素即代表该数字出现的次数,例如a[1]中的元素代表数字1出现的次数,a[2]中的元素代表数字2出现的次数。有了大概思路接下来就只需要将每个整数进行拆分,使得每个整数的每一位都能够得到统计。实现代码如下:
#include <stdio.h>
int main()
{
int num[11]={0};
int n,max;
scanf("%d",&n);
int i,j,k;
int d;
for (i=0;i<n;i++){
scanf("%d",&d);
if (d==0){
num[0]++;
} //因为遍历整数的每一位数字时的结束条件是d>0所以这里先将d==0的情况计算一遍
while (d>0){
num[d%10]++; //对整数的每一位数字进行遍历并将出现的次数用数组a来记录,数组下标即代表该数字
d/=10;
}
}
max=num[0];
for (j=0;j<11;j++){//找出数组a中的最大值即为数字最多的出现次数
if (num[j]>max){
max=num[j];
}
}
printf("%d:",max);
for (k=0;k<11;k++){
if (max==num[k]){
printf(" %d",k);//数组下标代表该数字
}
}
printf("\n");
return 0;
}
运行结果:
小结:一开始我想的是将每个整数的每一位都放入一个足够大的数组当中,然后遍历数组用多个int型变量来记录出现次数最多的数字及出现次数,但发现题目有可能出现多个数字出现的次数一样多,原来的想法就不知道如何实现了。后来想到数组下标也是int型且都为十进制,何不定义一个大小为10的数组用其下标来代表十个基础数字呢?