top1编程
← 返回题目
题解

计算多组大整数相乘

1 条题解

  • 0
    @ 2026-8-3 18:46:46

    解题思路

    两个数都不超过 100 位,乘积会溢出,要用高精度乘法。核心规律:

    a 的第 i 位(从 0 开始,个位是第 0 位)乘 b 的第 j 位,结果放到乘积数组的第 i+j 位。把每一对都乘完、累加好后,再统一从低位往高位处理进位。

    因为有多组数据,每组的数组都要清空后再计算。

    参考代码

    #include <iostream>
    using namespace std;
    
    char sa[105], sb[105];
    int a[105], b[105];
    int ans[210];
    
    int main() {
        int t;
        cin >> t;
        while (t--) {
            cin >> sa >> sb;
            int la = 0, lb = 0;
            while (sa[la]) la++;
            while (sb[lb]) lb++;
            // 清空数组
            for (int i = 0; i < 105; i++) { a[i] = 0; b[i] = 0; }
            for (int i = 0; i < 210; i++) ans[i] = 0;
            // 转数组,个位放最前面
            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';
            // 乘法:a的第i位乘b的第j位,放到结果的第i+j位
            for (int i = 0; i < la; i++)
                for (int j = 0; j < lb; j++)
                    ans[i + j] += a[i] * b[j];
            // 统一处理进位
            int hi = la + lb;
            for (int i = 0; i < hi; i++) {
                ans[i + 1] += ans[i] / 10;
                ans[i] %= 10;
            }
            // 去掉最高位可能多余的0
            while (hi > 0 && ans[hi] == 0) hi--;
            // 输出
            for (int i = hi; i >= 0; i--) cout << ans[i];
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    设 a、b 位数分别为 n、m,两层循环 n×m 次,时间复杂度 O(n×m);额外空间复杂度 O(n+m)。

    • 1