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
相关产品推荐
相关产品推荐

