top1编程
← 返回题目
题解

【基础】高精度加法

1 条题解

  • 0
    @ 2026-7-31 12:14:41

    解题思路

    高精度加法:两个不超过 240 位的数相加,数字太大不能直接用 int,要一位一位处理。

    思路:

    1. 逆序存数组:把两个加数的数字串逆序存进数组,个位放在 a[0]、b[0],方便从低位算起
    2. 逐位相加:从低位到高位,把 a[i] 和 b[i] 加起来放进 c[i]
    3. 处理进位:某一位超过 10,就把十位以上的部分进到更高一位
    4. 逆序输出:如果最高位进位产生了新的一位,位数加 1,然后从高到低输出

    为什么逆序存? 因为加法要从个位(低位)开始算,逆序存放后下标 0 就是个位,直接从 0 开始遍历就是低位到高位,方便进位。

    举例:333...333 + 222...222 = 555...555

    • 个位 3+2=5,十位 3+2=5……每一位都够,不用进位
    • 结果每一位都是 5

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    string s1, s2;
    int a[250], b[250], c[500];
    int len;
    
    int main() {
        cin >> s1 >> s2;
    
        for (int i = 0; i < s1.size(); i++) a[s1.size() - 1 - i] = s1[i] - '0';
        for (int i = 0; i < s2.size(); i++) b[s2.size() - 1 - i] = s2[i] - '0';
    
        len = s1.size();
        if (s1.size() < s2.size()) len = s2.size();
    
        for (int i = 0; i < len; i++) c[i] = a[i] + b[i];  // 逐位相加
    
        for (int i = 0; i < len; i++) {  // 处理进位
            if (c[i] >= 10) {
                c[i + 1] += c[i] / 10;
                c[i] = c[i] % 10;
            }
        }
    
        if (c[len] != 0) len++;  // 最高位进位
    
        for (int i = len - 1; i >= 0; i--) cout << c[i];  // 输出
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),N 为位数
    • 空间复杂度:O(N),存数字的数组
    • 1