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

C++入门:如何用long long处理超长数字字符串及实现大整数求和?

问题原因

long long类型有固定的取值上限,64位系统下最大只能存储9223372036854775807(约9×10¹⁸)。你输入的超长数字远超过这个范围,导致cin无法完成字符串到long long的转换,直接触发了"Invalid value!"错误分支。

解决方案:字符串模拟大数加法

因为C++的基础数值类型无法存储任意长度的数字,我们可以用字符串存储超长数字,手动模拟笔算加法的逻辑来实现求和:

#include <iostream>
#include <string>
#include <algorithm> // 用于反转字符串的reverse函数

using namespace std;

// 自定义函数:实现两个超长数字字符串的加法
string addBigNumbers(string num1, string num2) {
    // 反转字符串,方便从低位(原数字的个位)开始计算
    reverse(num1.begin(), num1.end());
    reverse(num2.begin(), num2.end());

    string result;
    int carry = 0; // 存储进位值
    int maxLen = max(num1.size(), num2.size()); // 取两个数字的最大长度

    // 逐位相加,直到处理完所有位
    for (int i = 0; i < maxLen; i++) {
        // 取出当前位的数字,超出字符串长度的位按0处理
        int digit1 = (i < num1.size()) ? (num1[i] - '0') : 0;
        int digit2 = (i < num2.size()) ? (num2[i] - '0') : 0;

        int currentSum = digit1 + digit2 + carry;
        carry = currentSum / 10; // 更新进位:取商作为新的进位
        result.push_back( (currentSum % 10) + '0' ); // 当前位结果转成字符存入结果
    }

    // 如果最后还有未处理的进位,添加到结果末尾
    if (carry != 0) {
        result.push_back(carry + '0');
    }

    // 反转结果字符串,恢复正确的数字顺序
    reverse(result.begin(), result.end());
    return result;
}

int main() {
    string x, y;
    cout << "Insert the first number: ";
    cin >> x;
    cout << "Insert the second number: ";
    cin >> y;

    // 调用自定义加法函数得到结果
    string sumResult = addBigNumbers(x, y);
    cout << "The result is: " << sumResult << endl;

    return 0;
}

代码说明

  • 用string类型存储输入的超长数字,完全避开数值类型的范围限制
  • 反转字符串是为了让我们从左到右就能按个位→十位→百位的顺序计算,和日常笔算逻辑一致
  • 逐位计算时处理进位,最后反转结果字符串得到正确的求和结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:51:21