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

软件2314张侃202221512027 软件23 2023-12-13 16:34:44

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

 

...全文
230 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

212

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧