top1编程
← 返回题目
题解

三个大整数加减

1 条题解

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

    解题思路

    计算 a + b - c,三个数都很大(最多 2000 位),用高精度分两步做:

    1. 先加:a 和 b 逐位相加,超过 10 进位。
    2. 再减:结果逐位减 c,不够减就向高一位借 1(题目保证 a+b ≥ c,不会出现负数)。

    数字转数组时个位放最前面,进位和借位都方便。最后从高位到低位输出,并去掉开头的 0。

    参考代码

    #include <iostream>
    using namespace std;
    
    char sa[2005], sb[2005], sc[2005];  // 三个大整数(字符串)
    int a[2005], b[2005], c[2005];      // 数字数组,个位在下标0
    int ans[2010];                      // 结果
    
    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 n = (la > lb) ? la : lb;
        for (int i = 0; i < n; i++) {
            ans[i] += a[i] + b[i];
            ans[i + 1] += ans[i] / 10;   // 进位
            ans[i] %= 10;
        }
        int hi = n;
        while (ans[hi]) hi++;            // 加法可能多出最高位
    
        // 第二步:再减 c(题目保证 a+b >= c)
        for (int i = 0; i < lc; i++) {
            ans[i] -= c[i];
            if (ans[i] < 0) {            // 不够减就向前借1
                ans[i] += 10;
                ans[i + 1] -= 1;
            }
        }
        // 去掉结果开头的0
        int pos = hi;
        while (pos > 0 && ans[pos] == 0) pos--;
        for (int i = pos; i >= 0; i--) cout << ans[i];
        return 0;
    }
    

    复杂度分析

    设最长的位数为 n,加法和减法各扫一遍,时间复杂度 O(n);额外空间复杂度 O(n)。

    • 1