PTA-团体程序设计天梯赛-练习集L1-003(C语言)

PTA-团体程序设计天梯赛-练习集L1-003(C语言)

这几天正在做PTA这个团体程序设计天梯赛上面的题,虽然有的题并不难,但还是会出现很多的问题。
下面是这几天做的其中一个题:
在这里插入图片描述
如果没有这个位数要求的话,先设一个长度为10并且每个的值都初始化为0的数组,对传进来的数求余所得数即为数组下标,将对应数组的数值自增1即可。代码如下:

#include <stdio.h>

int Count_Digit ( const int N, const int D );

int main()
{
    int N, D;
    scanf("%d %d", &N, &D);
    printf("%d\n", Count_Digit(N, D));
    return 0;
}
int Count_Digit ( const int N, const int D )
{
    int n = N, s;
	int p[10] = {0};
	if(n == 0 && D == 0)
    {
        return 1;
    }
    if(n<0) 
    {
    	n = -n;
	}
    while(n)
    {
        s = n % 10;
        p[s]++;
        n /= 10;
    }
    return p[D];
}

但在这个题中,主要是这个是有关大数的存储问题,其实好多时候我们都会碰到大数问题,比如求阶层之和、求两个大数的乘积等等,此时就不是简简单单定义一个整型或者长整型就可以解决问题。
分析:

  • 借用上面不用大数时的思想,也定义一个长度为10并且每个单元值都初始化为0的数组,用来装不同位数出现的个数
  • 其次,由于数的位数太多,就要定义一个数组:
char N[1001]; //如果用gets()会多一个'\0',需要多来一个位置
              //但是如果用scanf("%s",&N);则可定义为N[1000]
              //这个也是本题的一个测试点
  • 最后用switch语句,判断每位的数字(下标),每找见一次,就让对应的数组中的值自增1;
    代码如下:
#include <stdio.h>

main()
{
    char N[1001];
    int a[10]={0};
    gets(N);
    for(int i = 0; N[i] != '\0'; i++){
        switch(N[i]){
            case '0':a[0]++;break;
            case '1':a[1]++;break;
            case '2':a[2]++;break;
            case '3':a[3]++;break;
            case '4':a[4]++;break;
            case '5':a[5]++;break;
            case '6':a[6]++;break;
            case '7':a[7]++;break;
            case '8':a[8]++;break;
            case '9':a[9]++;break;
        }
    }
    for(int i = 0; i < 10; i++)
    {
            if(a[i]!=0)
            {
                if(i<9)
                {
                    printf("%d:%d\n", i, a[i]);
                }
                else
                {
                    printf("%d:%d", i, a[i]);
            	}
            	//题目要求结尾无空行
        	}
    }
}

除此之外,还有一种思路:
利用ASCII码,我们可以判断出 N[i]-‘0’ 即为下标;
此时,代码如下:

#include<stdio.h>
main(){
	char N[1000];
	int a[10] = {0};
	scanf("%s",&N);
	for(int i = 0; N[i] != '\0'; i++){
		a[N[i]-'0']++;
	}
	for(int i = 0; i < 10; i++){
         if(a[i]!=0){
             if(i<9)
             {
                 printf("%d:%d\n", i, a[i]);
             }
             else
             {
                 printf("%d:%d", i, a[i]);
             }
         }
     }
} 

这个题的特点:

  • 正好是0~9,可以定义一个长度为十的数组来进行保存每个数出现的次数
  • 可以利用ASCII码

总结:
对于这个题,虽说简单吧,但是中间也夹杂着许多的小问题,需要琢磨理清楚。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据提供的引用内容,这段代码是用来统计输入数字中奇数和偶数的个数的。代码中使用循环遍历输入的数字,通过对2取模运算来判断数字是奇数还是偶数,然后分别对奇数和偶数的计数变量进行加一操作。循环结束后,输出奇数计数变量和偶数计数变量的值,中间用空格隔开。\[1\]\[2\]\[3\] 这段代码可以用来解决团体程序设计天梯赛-练习 L1-022 奇偶分家的问题。 #### 引用[.reference_title] - *1* [PTA团队天梯赛L1-022 奇偶分家](https://blog.csdn.net/m0_46492118/article/details/114481127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PAT团队程序设计天梯赛-习题L1-022 奇偶分家](https://blog.csdn.net/qq_38234015/article/details/81291913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [团体程序设计天梯赛-练习 L1-022 奇偶分家 (10分)(C语言)](https://blog.csdn.net/Baridhu/article/details/109899606)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值