仅用iostream与string库的C++大数相加代码结果时对时错排查
大整数求和代码问题排查
问题1:缺少必要头文件引用
代码中调用了std::reverse函数,但仅引入了<iostream>和<string>库,部分编译器不会通过string头文件间接引入算法库,会导致编译失败或未定义行为,是不同环境运行结果不一致的常见诱因。
修复方案:在头文件声明区域添加:
#include <algorithm>
问题2:输入读取方式兼容性不足
你使用getline按行读取输入,仅支持「两个大整数各占一行」的输入格式。如果测试用例中两个大整数为同一行空格分隔的格式,第一次getline会把两个数全部读入num1,num2将为空字符串,最终计算结果完全错误,这是部分测试用例失败的核心原因。
修复方案:将两次getline调用替换为cin输入,默认以任意空白符(空格、换行、制表符等)作为分隔符,兼容所有常见输入格式:
cin >> num1 >> num2;
问题3:边界场景处理错误
当输入两个值为0的大整数时,计算得到的sum初始为低位在前的"0",原有去前导零的逻辑会把唯一的0也删除,最终输出空字符串,不符合预期。
修复方案:修改去前导零的逻辑,仅在字符串长度大于1时删除末尾的前导零:
while(sum.length() > 1 && sum.back() == '0'){ sum.pop_back(); }
修复后完整代码
#include <iostream> #include <string> #include <algorithm> using namespace std; int main (){ string num1 , num2 ,sum; cin >> num1 >> num2; if (num2.length() > num1.length()) { num2.swap(num1); } reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); while(num2.length() < num1.length()) num2.push_back('0'); size_t lnth = num1.length(); unsigned tmp , holder=0; for (size_t i = 0;i < lnth ; i++){ tmp = (num1[i] - '0') + (num2[i] - '0') + holder; sum.push_back(tmp % 10 + '0'); holder = tmp / 10; } if(holder > 0){ sum.push_back('0' + holder); } while(sum.length() > 1 && sum.back() == '0'){ sum.pop_back(); } reverse(sum.begin(), sum.end()); cout << sum; return 0; }
内容的提问来源于stack exchange,提问作者Hamid
相关产品推荐
相关产品推荐

