You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++11中如何实现long long等类型无法容纳的超长整数加法?

处理C++中大数加法的解决方案

嘿,这个问题我太懂了!C++原生的整数类型确实顶不住14位以上的大数,用字符串存储是完全正确的思路——接下来咱们就用模拟竖式加法的逻辑来实现,和小学学的加法步骤一模一样,上手超简单。

核心思路拆解

其实就是复刻咱们手写加法的过程:

  • 先把两个大数字符串右对齐(因为加法是从个位开始算的),长度不够的补前导零
  • 从最后一位(个位)开始逐位相加,同时记录进位值
  • 所有位加完后,如果还有进位,要把这个进位也加到结果里
  • 最后把临时存储的结果反转,得到正确顺序的大数和

完整实现代码

咱们直接上可运行的代码,结合你用static string array存储大数的场景:

#include <iostream>
#include <string>
#include <algorithm> // 用于reverse函数

using namespace std;

// 实现两个大数字符串的加法
string addLargeNumbers(const string& num1, const string& num2) {
    string result;
    int carry = 0;
    int i = num1.size() - 1;
    int j = num2.size() - 1;

    // 从末尾开始逐位相加,直到所有位处理完且进位为0
    while (i >= 0 || j >= 0 || carry > 0) {
        // 取出当前位的数字,超出长度的话视为0
        int digit1 = (i >= 0) ? (num1[i] - '0') : 0;
        int digit2 = (j >= 0) ? (num2[j] - '0') : 0;

        // 计算当前位的和加上进位
        int sum = digit1 + digit2 + carry;
        // 当前位的结果是sum对10取余
        result.push_back((sum % 10) + '0');
        // 更新进位为sum除以10的商
        carry = sum / 10;

        // 指针左移
        i--;
        j--;
    }

    // 因为是从后往前加的,结果是逆序的,需要反转回来
    reverse(result.begin(), result.end());
    return result;
}

int main() {
    // 假设你的static string array存储了两个大数
    static string largeNums[] = {"123456789012345", "987654321098765"};
    
    string sum = addLargeNumbers(largeNums[0], largeNums[1]);
    cout << "大数相加结果:" << sum << endl; // 输出应该是1111111110111110
    return 0;
}

关键细节说明

  • 字符转数字:num[i] - '0'是把字符形式的数字转成整数,因为ASCII码里'0'到'9'是连续的
  • 进位处理:每次相加后,进位是sum / 10,当前位结果是sum % 10,这个逻辑和竖式加法完全一致
  • 反转结果:因为我们是从个位开始往高位加,所以结果存在字符串里是逆序的,最后必须用reverse转回来
  • 边界情况:比如两个数长度不一样、相加后最高位有进位(比如999+1=1000),代码里的循环条件i >=0 || j >=0 || carry>0已经覆盖了这些情况

扩展小技巧

如果你的static string array里有多个大数需要累加,只需要循环调用这个加法函数就行:比如先把前两个相加,结果和第三个加,以此类推。

内容的提问来源于stack exchange,提问作者Victor Nwadike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:25:20