给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
考察知识点:
1. 整型变量在储存单元中是以补码形式存储。分为两大类:有符号和无符号类型。
小类分为基本整形(int),短整型(short),长整型(long),双长型(long long)
注意:无符号类型大于等于0,在开头直接加unsigned,如 unsigned int,unsigned short。
相同小类在电脑的存储空间相同,如 int 和 unsigned int 都是4个字节,所以相同小类的无符号类型最大值取值大于有符号类型。因此unsigned long long 可取最大 2^62 -1,但是这里仍然小于1000位,因此不能用一个变量直接存储输入的整数。
2. 条件语句
switch(表达式)
{
case 常量1:语句1;
case 常量2:语句2;
……
default : 语句;
}
注意:表达式类型需要是整数类型(包括字符型),default不一定放最后,case后面的常量不能相同,一般情况下每个语句后面带break。
解题思路:
根据题目要求,正整数N的取值范围至1000位,这里用字符变量来存储数字。之后将数字取出,用switch计算出现次数,最后输出。
运行代码:
#include <stdio.h>
void fun(int s[],int n);
int main()
{
char N[1000]={0};
int n[10]={0};
int i=0;
while ((N[i]=getchar())!='\n')
{
switch (N[i])
{
case '0':n[0]++;break;
case '1':n[1]++;break;
case '2':n[2]++;break;
case '3':n[3]++;break;
case '4':n[4]++;break;
case '5':n[5]++;break;
case '6':n[6]++;break;
case '7':n[7]++;break;
case '8':n[8]++;break;
case '9':n[9]++;break;
default:putchar('\a');
}
i++;
}
for (i=0;i<10;i++)
{
if (n[i]!=0)
{
printf("%d:%d",i,n[i]);
putchar('\n');//注意位置
}
}
return 0;
}