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

