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

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

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码

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5154926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存