给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定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>
#define MAXSIZE 10000
void FindMaxPrint(int number[]);
int main(void)
{
int num;
scanf("%d ",&num);
char array[MAXSIZE];
char ch;
for(int i=0;(ch=getchar())!='\n';i++)
{
array[i]=ch;
}
int number[10]={0};
for(int i=0;array[i]!='\0';i++)
{
if(array[i]!=' ')
{
switch(array[i])
{
case '0':
number[0]++;
break;
case '1':
number[1]++;
break;
case '2':
number[2]++;
break;
case '3':
number[3]++;
break;
case '4':
number[4]++;
break;
case '5':
number[5]++;
break;
case '6':
number[6]++;
break;
case '7':
number[7]++;
break;
case '8':
number[8]++;
break;
case '9':
number[9]++;
break;
default:
break;
}
}
}
FindMaxPrint(number);
return 0;
}
void FindMaxPrint(int number[])
{
int Max=number[0];
for(int i=0;i<10;i++)
{
if(number[i]>Max)
Max=number[i];
}
printf("%d:",Max);
for(int i=0;i<10;i++)
{
if(number[i]==Max)
printf(" %d",i);
}
}
直接输入进字符数组,一个一个去比较。虽然通过了,但是是一种非常糟糕的方法。
在看了一下别人的过后,自己又重新写了一个。
#include<stdio.h>
int main(void)
{
int n;
scanf("%d",&n);
int array[10]={
0
};//这里是不完全初始化,第一个初始为0,后面的没有被初始化,但其自动为0,如果这里是1,那这个数组就是1 0 0 0 0 0 0 0 0 0
int num;
for(int i=0;i<n;i++)
{
scanf("%d",&num);
if(num==0)
array[0]++;//在题目中没有这个if语句也可以通过,但是自己测试例如4 0 0 0 就不会输出正确的结果。见代码块后面的图。
while(num)
{
array[num%10]++;//取到每位的数放放到相同下标的array中
num/=10;//去掉最后一位
}
}
int max=array[0];
for(int i=0;i<10;i++)//找到最大
{
if(array[i]>max)
max=array[i];
}
printf("%d:",max);
for(int i=0;i<10;i++)//输出是最大的
{
if(array[i]==max)
printf(" %d",i);
}
return 0;
}
去掉那个if语句得到这样的结果,显然就不合题意,加上后再输入。
这样就正确了。