top1编程
← 返回题目
题解

先加再乘

1 条题解

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

    解题思路

    要算 (a+b)×c,a、b、c 的长度都不超过 200 位,直接乘会超出 long long,所以要用高精度。

    分两步走:

    第一步:算 a+b(高精度加法)

    把 a 和 b 一位一位转成数字,个位放在数组最前面。从个位开始逐位相加,每位超过 9 就向上一位进 1。得到和 s。

    第二步:算 s×c(高精度乘法)

    乘法模拟竖式:第 i 位的数字乘第 j 位的数字,结果累加到第 i+j 位,最后统一进位。

    这和手算两位数乘两位数的方法一模一样,只是数位特别多。

    参考代码

    // 用途:计算 (a+b)*c,a、b、c 都是大整数(长度不超过 200)
    #include <iostream>
    using namespace std;
    
    char sa[205], sb[205], sc[205];
    int a[205], b[205], c[205];
    int sum[205], res[405];
    
    int main() {
        cin >> sa >> sb >> sc;
        int la = 0, lb = 0, lc = 0;
        while (sa[la]) la++;
        while (sb[lb]) lb++;
        while (sc[lc]) lc++;
        // 转成数字数组,个位放最前面
        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 < lc; i++) c[i] = sc[lc - 1 - i] - '0';
    
        // 第一步:a + b
        int ls = (la > lb ? la : lb);
        int up = 0;
        for (int i = 0; i < ls; i++) {
            int v = a[i] + b[i] + up;
            sum[i] = v % 10;
            up = v / 10;
        }
        while (up) {              // 最高位进位
            sum[ls] = up % 10;
            up /= 10;
            ls++;
        }
    
        // 第二步:sum * c(高精度乘高精度)
        for (int i = 0; i < ls; i++)
            for (int j = 0; j < lc; j++)
                res[i + j] += sum[i] * c[j];
        int len = ls + lc;
        for (int i = 0; i < len; i++) {
            res[i + 1] += res[i] / 10;
            res[i] %= 10;
        }
        while (len > 1 && res[len - 1] == 0) len--;
    
        // 输出结果
        for (int i = len - 1; i >= 0; i--) cout << res[i];
        cout << endl;
        return 0;
    }
    

    复杂度分析

    设 a、b、c 的位数分别是 la、lb、lc。加法是 O(la+lb),乘法两重循环是 O((la+lb)×lc)。总时间复杂度 O((la+lb)×lc)。

    • 1