这几天正在做PTA这个团体程序设计天梯赛上面的题,虽然有的题并不难,但还是会出现很多的问题。
下面是这几天做的其中一个题:
如果没有这个位数要求的话,先设一个长度为10并且每个的值都初始化为0的数组,对传进来的数求余所得数即为数组下标,将对应数组的数值自增1即可。代码如下:
#includeint 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;
代码如下:
#includemain() { 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码
总结:
对于这个题,虽说简单吧,但是中间也夹杂着许多的小问题,需要琢磨理清楚。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)