top1编程
← 返回题目
题解

统计数码

1 条题解

  • 0
    @ 2026-8-4 1:18:03

    解题思路

    题目要求计算 a×b 的结果里,数字 c 出现了几次。

    a 和 b 可能特别大(几十位甚至上百位),直接存进 long long 会溢出,所以要用高精度乘法。

    高精度乘法的做法和手算竖式一模一样:

    1. 把 a、b 当成字符串读入,再一位一位转成数字,存进数组(个位放在数组最前面,方便从低位开始算)。
    2. 模拟竖式:第 i 位的数字乘第 j 位的数字,结果加到答案数组的第 i+j 位,也就是 res[i+j] += a[i]*b[j]。
    3. 全部乘完后,从低位到高位处理进位:每一位超过 9 就往上一位进 1。
    4. 去掉结果前面的 0。
    5. 最后数一数结果数组里有几个数字等于 c,输出次数。

    参考代码

    // 用途:统计大整数 a*b 的结果中数码 c 出现的次数(高精度乘法)
    #include <iostream>
    using namespace std;
    
    char sa[1005], sb[1005];
    int a[1005], b[1005], res[2005];
    
    int main() {
        int c;
        cin >> sa >> sb >> c;
        // 求两个数的长度(个位放最前面)
        int la = 0, lb = 0;
        while (sa[la]) la++;
        while (sb[lb]) lb++;
        for (int i = 0; i < la; i++) a[i] = sa[la - 1 - i] - '0';
        for (int i = 0; i < lb; i++) b[i] = sb[lb - 1 - i] - '0';
    
        // 竖式乘法:每一位相乘后累加
        for (int i = 0; i < la; i++)
            for (int j = 0; j < lb; j++)
                res[i + j] += a[i] * b[j];
        // 统一进位
        int len = la + lb;
        for (int i = 0; i < len; i++) {
            res[i + 1] += res[i] / 10;
            res[i] %= 10;
        }
        // 去掉前导 0
        while (len > 1 && res[len - 1] == 0) len--;
    
        // 统计数码 c 出现的次数
        int cnt = 0;
        for (int i = 0; i < len; i++)
            if (res[i] == c) cnt++;
        cout << cnt << endl;
        return 0;
    }
    

    复杂度分析

    设 a 有 la 位、b 有 lb 位。乘法要两重循环,时间复杂度是 O(la×lb);进位和统计都只要扫一遍,是 O(la+lb)。所以总时间复杂度 O(la×lb)。

    • 1