在C语言中实现超大无符号整数加法的方法
解决C语言中超大无符号整数加法的问题
你的问题很典型——C语言里的unsigned long long类型最大只能表示到18446744073709551615(约1.8×10¹⁹),远小于10⁹⁸,所以直接用整数类型存储肯定会溢出,必须用字符串模拟手工加法的思路来实现。
核心思路
手工加法的逻辑我们都熟悉:从最低位开始逐位相加,处理进位,最后把结果倒过来。对应到代码里就是:
- 反转两个输入字符串,让最低位在数组的起始位置,方便从左到右遍历相加
- 逐位计算当前位的和,加上进位,得到当前位的数字和新的进位
- 处理完所有位后,如果还有剩余进位,要追加到结果里
- 最后反转结果字符串,得到正确的顺序
完整代码实现
#include <stdio.h> #include <string.h> // 反转字符串的辅助函数 void reverse(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } } int main() { // 两个10^98的数相加最多是100位,所以数组开足够大的空间 char a[101], b[101], result[102] = {0}; int len_a, len_b, max_len, carry = 0; // 循环读取输入的两个超大数(字符串形式) while (scanf("%s %s", a, b) == 2) { len_a = strlen(a); len_b = strlen(b); max_len = len_a > len_b ? len_a : len_b; carry = 0; // 反转字符串,方便从低位开始相加 reverse(a); reverse(b); // 逐位相加处理 for (int i = 0; i < max_len; i++) { // 短字符串超出长度的位用0补全 int digit_a = (i < len_a) ? (a[i] - '0') : 0; int digit_b = (i < len_b) ? (b[i] - '0') : 0; int sum = digit_a + digit_b + carry; // 当前位的数字是sum%10,进位是sum/10 result[i] = (sum % 10) + '0'; carry = sum / 10; } // 处理最后剩余的进位(比如999+1=1000的情况) if (carry != 0) { result[max_len] = carry + '0'; max_len++; } // 反转结果得到正确顺序 reverse(result); // 输出结果 printf("%s\n", result); // 重置结果数组,准备下一次计算 memset(result, 0, sizeof(result)); } return 0; }
代码细节说明
- 反转字符串:
reverse函数把输入字符串反转,比如"123"变成"321",这样我们可以从索引0开始处理最低位,完全贴合手工加法的顺序。 - 补位处理:遍历到两个字符串的最长长度,短字符串超出长度的位用0代替,避免数组越界的同时保证加法逻辑统一。
- 进位处理:每一位相加后,当前位保留
sum%10的结果,进位则是sum/10,最后如果还有未处理的进位,直接追加到结果末尾。 - 结果重置:每次计算完成后清空结果数组,确保下一次计算不受上一次的影响。
这个代码可以轻松处理0到10⁹⁸之间的任意无符号整数加法,不会出现溢出问题。
内容的提问来源于stack exchange,提问作者Keerthana
相关产品推荐
相关产品推荐

