这几天正在做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("%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];
}
但在这个题中,主要是这个是有关大数的存储问题,其实好多时候我们都会碰到大数问题,比如求阶层之和、求两个大数的乘积等等,此时就不是简简单单定义一个整型或者长整型就可以解决问题。
分析:
char N[1001]; //如果用gets()会多一个'\0',需要多来一个位置
//但是如果用scanf("%s",&N);则可定义为N[1000]
//这个也是本题的一个测试点
#include
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
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]);
}
}
}
}
总结:
对于这个题,虽说简单吧,但是中间也夹杂着许多的小问题,需要琢磨理清楚。