作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答;
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。
一、题目描述
给定一个 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
二、解题思路
读题:
//1.接收整数N
//2.统计这个整数由0-9的哪几个数字组成,每个数字出现了几次
//3.输出时把出现次数不为0的数字及其次数按“数字:次数“的格式进行输出
总结——本题主要就是接收一个整数,看它是由0-9中的哪些数字组成的,并且那些数字各出现了几次,把出现次数>0的数字用特定格式表示出来。
思路:
1.定义需要的变量(因为输入的整数唯一的作用就是统计0-9各个数字在这个整数中出现了几次,只要累加并保存了次数,这个数字没必要存储,也能省去判断数据范围会不会超出变量范围的麻烦,所以我们把输入的整数当做字符来接收,定义一个字符变量用来存储一位数字就好);
2.设置循环之循环条件的设置:当接收的字符不是换行符时,说明此时待输入的整数还没接收完,继续接收;当接收的是换行符时,说明接收结束,循环结束;
3.设置循环之循环体的排兵布阵:每一轮循环会从待接收整数的高位开始,一轮循环接收一位,设置判断语句判断当前位是0-9的哪个数字,并给存储那个数字次数的变量+1。当循环结束时,便把输入整数中0-9每个数字的出现次数都统计完成,并且保存在相应的变量中;
4.设置循环,从0到9,把每个数字的出现次数检测一遍,把出现次数大于0的数字以及它的出现次数按特定格式进行打印。
三、具体实现
0.标准C源程序框架
#include <stdio.h>
int main()
{
return 0;
}
1.定义需要的变量(因为输入的整数唯一的作用就是统计0-9各个数字在这个整数中出现了几次,只要累加并保存了次数,这个数字没必要存储,也能省去判断数据范围会不会超出变量范围的麻烦,所以我们把输入的整数当做字符来接收,定义一个字符变量用来存储一位数字就好);
char c = 'w';//一位位接收输入数字的变量
int amount[10] = { 0 };//存储0-9每个数字在输入数字中的出现次数
int i = 0;//循环变量
2.设置循环之循环条件的设置:当接收的字符不是换行符时,说明此时待输入的整数还没接收完,继续接收;当接收的是换行符时,说明接收结束,循环结束;
while ((c=getchar())!='\n')
{
//对接收到的当前位数字进行检测,检测出来其是0-9的哪一位数字,便给哪一位的出现次数+1
}
3.设置循环之循环体的排兵布阵:每一轮循环会从待接收整数的高位开始,一轮循环接收一位,设置判断语句判断当前位是0-9的哪个数字,并给存储那个数字次数的变量+1。当循环结束时,便把输入整数中0-9每个数字的出现次数都统计完成,并且保存在相应的变量中;
while ((c=getchar())!='\n')
{
switch (c)
{
case '0':
amount[0]++;
break;
case '1':
amount[1]++;
break;
case '2':
amount[2]++;
break;
case '3':
amount[3]++;
break;
case '4':
amount[4]++;
break;
case '5':
amount[5]++;
break;
case '6':
amount[6]++;
break;
case '7':
amount[7]++;
break;
case '8':
amount[8]++;
break;
case '9':
amount[9]++;
break;
default:
break;
}
}
4.设置循环,从0到9,把每个数字的出现次数检测一遍,把出现次数大于0的数字以及它的出现次数按特定格式进行打印。
while (i < 10)
{
if (amount[i] != 0)
printf("%d:%d\n",i,amount[i]);
i++;
}
四、测试数据
程序比较简单,一般直接就可以通过了。写代码的时候如果用while()循环的话要注意写上迭代条件,确保程序的有穷性。其他的也没什么注意的了。
五、全部代码
#include <stdio.h>
int main()
{
char c = 'w';//一位位接收输入数字的变量
int amount[10] = { 0 };//存储0-9每个数字在输入数字中的出现次数
int i = 0;//循环变量
while ((c=getchar())!='\n')
{
switch (c)
{
case '0':
amount[0]++;
break;
case '1':
amount[1]++;
break;
case '2':
amount[2]++;
break;
case '3':
amount[3]++;
break;
case '4':
amount[4]++;
break;
case '5':
amount[5]++;
break;
case '6':
amount[6]++;
break;
case '7':
amount[7]++;
break;
case '8':
amount[8]++;
break;
case '9':
amount[9]++;
break;
default:
break;
}
}
while (i < 10)
{
if (amount[i] != 0)
printf("%d:%d\n",i,amount[i]);
i++;
}
return 0;
}