top1编程
← 返回题目
题解

三个大整数相加

1 条题解

  • 0
    @ 2026-8-3 18:39:20

    解题思路

    三个数都很大(最多 2000 位),直接相加会溢出,所以要高精度加法:一位一位地加。

    做法:把每个大整数当字符串读进来,转成数组时个位放在最前面。然后把三个数同一位置上的数字相加,超过 10 就往高一位进 1。最后从高位到低位把结果输出。

    参考代码

    #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';
    
        // 找到三个数中最长的位数
        int n = la;
        if (lb > n) n = lb;
        if (lc > n) n = lc;
    
        // 三个数同一位置的数字相加
        for (int i = 0; i < n; i++) {
            ans[i] += a[i] + b[i] + c[i];  // 这一位三个数字加起来
            ans[i + 1] += ans[i] / 10;     // 超过10的部分进位
            ans[i] %= 10;
        }
    
        // 最高位可能还有进位
        while (ans[n]) n++;
    
        // 从高位到低位输出
        for (int i = n - 1; i >= 0; i--) cout << ans[i];
        return 0;
    }
    

    复杂度分析

    设三个数中最长的位数为 n,只要扫一遍,时间复杂度是 O(n);额外空间复杂度也是 O(n)。

    • 1