PTA 数组1课后 L2-5 求一批整数中出现个数最多的数字

落日与断鸿 落日与断鸿 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定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的数组用其下标来代表十个基础数字呢?

 

...全文
评论
收藏 已收藏
分享
返回顶部