C语言PAT刷题 - 1021 个位数统计

作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答;
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。

一、题目描述
给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值