栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

这几天正在做PTA这个团体程序设计天梯赛上面的题,虽然有的题并不难,但还是会出现很多的问题。
下面是这几天做的其中一个题:

如果没有这个位数要求的话,先设一个长度为10并且每个的值都初始化为0的数组,对传进来的数求余所得数即为数组下标,将对应数组的数值自增1即可。代码如下:

#include 

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

int main()
{
    int N, D;
    scanf("%d %d", &N, &D);
    printf("%dn", 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()会多一个'',需要多来一个位置
              //但是如果用scanf("%s",&N);则可定义为N[1000]
              //这个也是本题的一个测试点
  • 最后用switch语句,判断每位的数字(下标),每找见一次,就让对应的数组中的值自增1;
    代码如下:
#include 

main()
{
    char N[1001];
    int a[10]={0};
    gets(N);
    for(int i = 0; N[i] != ''; 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:%dn", i, a[i]);
                }
                else
                {
                    printf("%d:%d", i, a[i]);
            	}
            	//题目要求结尾无空行
        	}
    }
}

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

#include
main(){
	char N[1000];
	int a[10] = {0};
	scanf("%s",&N);
	for(int i = 0; N[i] != ''; i++){
		a[N[i]-'0']++;
	}
	for(int i = 0; i < 10; i++){
         if(a[i]!=0){
             if(i<9)
             {
                 printf("%d:%dn", i, a[i]);
             }
             else
             {
                 printf("%d:%d", i, a[i]);
             }
         }
     }
} 
这个题的特点:
  • 正好是0~9,可以定义一个长度为十的数组来进行保存每个数出现的次数
  • 可以利用ASCII码

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443725.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号