C++大整数相加输出随机数问题排查与修正求助
20位大整数相加代码错误排查与修正及C字符串处理指导
原代码错误分析
- 未初始化数组与输入越界处理缺失:输入字符串长度可能不足20,直接循环20次转换字符时,超出字符串长度的部分是未定义的垃圾值,导致
n1、n2数组出现随机数。 - 数字存储顺序错误:输入字符串的第一个字符是最高位,但代码直接按顺序存入数组,相加时从数组末尾(对应原字符串低位后的垃圾值)开始计算,逻辑完全错误。
- sum数组移位逻辑错误:无进位时的移位操作会导致数组元素覆盖混乱,输出时出现多余无效值。
- 未实现和超过20位的提示逻辑:原需求要求和超过20位时输出提示,代码未处理该部分。
修正后的代码
#include<iostream> #include<cstring> using namespace std; int main() { int n1[20] = {0}, n2[20] = {0}; // 初始化数组为0,避免垃圾值 int sum[21] = {0}; int carry = 0; char x1[21], x2[21]; int len1, len2; cout << "Enter the first integer(at most 20 digits): "; cin >> x1; cout << "Enter the second integer(at most 20 digits): "; cin >> x2; len1 = strlen(x1); len2 = strlen(x2); // 把字符串逆序存入数组,个位在索引0,方便从低位到高位相加 for (int i = 0; i < len1; i++) { n1[i] = x1[len1 - 1 - i] - '0'; } for (int i = 0; i < len2; i++) { n2[i] = x2[len2 - 1 - i] - '0'; } // 从低位到高位相加 for (int i = 0; i < 20; i++) { sum[i] = n1[i] + n2[i] + carry; if (sum[i] > 9) { carry = 1; sum[i] -= 10; } else { carry = 0; } } // 处理最高位的进位并输出提示 if (carry != 0) { sum[20] = carry; cout << "Warning: The sum exceeds 20 digits!" << endl; } cout << "The sum of the two integers is: "; // 找到输出起始位置,跳过前置0 int start = 20; while (start > 0 && sum[start] == 0) { start--; } // 从高位到低位输出结果 for (int i = start; i >= 0; i--) { cout << sum[i]; } cout << endl; return 0; }
C字符串数组处理指导
- 数组必须初始化:未初始化的数组会包含随机垃圾值,处理数字时务必用
{0}或memset将数组初始化为0。 - 获取有效长度:用
strlen()获取字符串的有效长度,注意字符串末尾的'\0'不计算在内,避免访问超出字符串范围的内存。 - 数字存储顺序优化:处理大整数运算时,建议将字符串逆序存入数组,让个位对应数组索引0,方便从低位到高位依次计算进位。
- 边界检查:输入时要确保字符串长度不超过数组容量(比如这里限制20位,数组定义为21是为了存储结束符
'\0'),可通过strlen()判断长度是否超标,超出则提示输入错误。 - 避免越界访问:循环处理字符串时,循环上限应为字符串的有效长度,而非数组总长度,防止访问未定义的内存区域。
内容的提问来源于stack exchange,提问作者user24234426
相关产品推荐
相关产品推荐

