top1编程
← 返回题目
题解

大整数相减

1 条题解

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

    解题思路

    要算 a-b,a 和 b 都可能特别大,而且结果可能是负数(比如 145-14567 = -67)。

    高精度减法的关键:

    1. 先判断结果正负:比较 a 和 b 的大小。如果 a < b,就交换 a、b,让大的数在前,并在最后输出负号。
    2. 逐位相减:从个位开始,a[i] - b[i],不够减就向高位借 1(借来的 1 等于 10)。
    3. 去掉前导 0:如果结果是 0,输出一个 0 就行。

    因为有多组数据,每算完一组要把数组清空,避免上一组残留的数字影响下一组。

    参考代码

    // 用途:计算大整数 a-b 的差,t 组数据,结果可能为负数(高精度减法)
    #include <iostream>
    using namespace std;
    
    char sa[1005], sb[1005];
    int a[1005], b[1005], res[1005];
    
    int main() {
        int t;
        cin >> t;
        while (t--) {
            cin >> sa >> sb;
            int la = 0, lb = 0;
            while (sa[la]) la++;
            while (sb[lb]) lb++;
    
            // 判断 a 和 b 谁大
            int neg = 0;
            if (la < lb) neg = 1;
            else if (la == lb) {
                for (int i = 0; i < la; i++) {
                    if (sa[i] != sb[i]) { neg = (sa[i] < sb[i]); break; }
                }
                int same = 1;
                for (int i = 0; i < la; i++)
                    if (sa[i] != sb[i]) { same = 0; break; }
                if (same) { cout << 0 << endl; continue; }  // 相等则差为 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 小,交换,让 a 始终是较大的数,并标记负号
            if (neg) {
                for (int i = 0; i < 1005; i++) { int t2 = a[i]; a[i] = b[i]; b[i] = t2; }
                int t2 = la; la = lb; lb = t2;
            }
    
            // 十进制减法
            int borrow = 0, len = la;
            for (int i = 0; i < len; i++) {
                int v = a[i] - b[i] - borrow;
                if (v < 0) { v += 10; borrow = 1; }
                else borrow = 0;
                res[i] = v;
            }
            while (len > 1 && res[len - 1] == 0) len--;   // 去掉前导 0
    
            if (neg) cout << "-";
            for (int i = len - 1; i >= 0; i--) cout << res[i];
            cout << endl;
    
            // 清空数组,准备下一组
            for (int i = 0; i < 1005; i++) a[i] = b[i] = res[i] = 0;
        }
        return 0;
    }
    

    复杂度分析

    设一组数据中 a 有 la 位、b 有 lb 位。比较大小和逐位相减都是 O(la+lb)。t 组数据加起来就是 O(t×(la+lb))。

    • 1