昨天晚上做了一道PTA习题,题目为个位数统计,难度不大,今天我就来分享一下我的解题思路.
一,正常的解法
一般拿到这道题,可能会用双长整型来表示N的值.结果用于统计出现次数的函数代码为:
void counts(long long int n, int*a){
long long int t = 0;
t = n;
while(t >= 10){
int m = t % 10;
a[m] += 1;
t /= 10;
}
a[t] += 1;
}
提交代码后发现有一个测试点没过.仔细分析后发现题目中的N的表述为:一个不超过 1000 位的正整数.这也就是说上面的双长整型并不能表示全部的N.
二,分而治之
既然无法用正常的数表示N,那么就应该采用其他的办法.把输入的数字读入为一串字符,然后在统计每个数字出现的次数即可.这其中会用到一个atoi()函数,它是将ASCII值转换成整型数字.统计出现次数的函数代码第二版本为:
/**
* @a 输入的字符串
* @b 结果值 指针b传入之前需要初始化为0
*/
void counts_v2(char*a, int *b){
char *c = a;
// 用于计算输入的位数
int i = 0;
// 指针指向尾巴
while (*c != '\0'){
i++;
c++;
}
// 指针往左移动
for (int j=0; j< i;j++) {
c--;
int n = atoi(c);
b[n] += 1;
*c = '\0';
}
}
注意指针在从右往左移动的过程中,每移动一位就要将移动前的位置上的内容置为'\0'
最终全部测试结果通过: