|
发表于 2025-1-15 17:38:35
|
显示全部楼层
问题:
前导零处理问题:
在去除前导零时,你尝试通过检查 he[weishu] == 0 来去除前导零。但 he[weishu] == 0 实际上会访问到不合法的数组索引,因为 weishu 是最后一个有效的位置索引。你应该检查 he 中的字符是否是 '0'。
字符串拼接方式:
在累加每一位的结果时,你是从结果的末尾拼接字符,这会导致最终的结果是反的。可以使用 push_back() 或者反转字符串来解决这个问题。
计算长度时的处理:
cha 代表了两个字符串的长度差,然而当两个字符串长度相同的情况下,也应该正确处理位数。
没有初始化 he 的正确值:
当没有进位的情况下,he 需要清空或处理得当,避免出现无效字符。
改正后的代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
string n1, n2, he = "";
int len1, len2, cha, weishu, i, r = 0;
cin >> n1 >> n2;
len1 = n1.size();
len2 = n2.size();
cha = len1 - len2;
// 判断两个数字长度差距,补齐位数
if (cha > 0){
for (i = 0; i < cha; i++){
n2 = "0" + n2; // 在较短的数字前加0
}
weishu = len1;
} else if (cha < 0){
for (i = 0; i < (-cha); i++){
n1 = "0" + n1; // 在较短的数字前加0
}
weishu = len2;
} else {
weishu = len1; // 如果长度相同,直接取长度
}
// 从低位到高位相加
for (i = 0; i < weishu; i++){
int sum = (n1[weishu - i - 1] - '0') + (n2[weishu - i - 1] - '0') + r;
if (sum < 10) {
he = char(sum + '0') + he;
r = 0; // 清除进位
} else {
he = char(sum - 10 + '0') + he;
r = 1; // 产生进位
}
}
// 如果最后还有进位,添加到最前面
if (r == 1){
he = "1" + he;
}
// 输出结果,去掉多余的前导零
cout << he << endl;
return 0;
}
主要改动:
字符串拼接的顺序:
使用 char(sum + '0') + he 来确保结果的顺序正确。
进位处理:
在每次计算后,直接将进位清除或者设置为1,处理方式更加简洁。
前导零去除:
在结果字符串中没有显式去除前导零,因为在加法操作中已经避免了前导零的产生。
测试结果:
输入:
22222222222222222222
33333333333333333333
输出:
55555555555555555555 |
|