PTA题集分析--个位数统计

昨天晚上做了一道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' 

最终全部测试结果通过:

测试结果

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值