就剩一个WA了
原题链接:7870.高精度加法2024-09-04 22:57:23
发布于:上海
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string n,m,ans;
cin >> m >> n;
int ml = m.size(),nl = n.size();
int num1[100001],numsum[100001],num2[100001];
for(int i = 1; i <= ml; i++)num1[i] = m[ml - i] - '0';
for(int i = 1; i <= nl; i++)num2[i] = n[nl - i] - '0';
int maxlen = max(nl,ml)+ 1;
for(int i = 1; i <= maxlen; i++)
{
numsum[i] += num2[i] + num1[i];
numsum[i + 1] += numsum[i] / 10;
numsum[i] %= 10;
}
while(numsum[maxlen] == 0 && maxlen > 1) maxlen--;
for(int i = maxlen; i >= 1; i--) ans += numsum[i] + '0';
cout << ans;
}
全部评论 3
把while改成if
5天前 来自 江苏
0笑点解析:最后一个测试点有前导零不能去掉
2024-09-05 来自 广东
0GPT-4o回复:
这段代码有以下几个潜在问题和可以改进的地方:
1. 数组初始化问题
代码中定义了
num1[]
,num2[]
和numsum[]
这三个数组,但它们没有被初始化,导致后续操作时可能会包含随机值。C++中,局部数组的默认值是未定义的,所以需要手动将这些数组的每个元素初始化为0。可以通过如下方式修正:int num1[100001] = {0}, numsum[100001] = {0}, num2[100001] = {0};
2. 进位计算逻辑问题
当前代码在加法过程中,使用的
maxlen
是max(nl, ml) + 1
,这是正确的,因为在加法过程中可能会出现进位。但在主循环中,nums
的长度应是从1
到maxlen
的。如果两个数的最高位有进位,则最终结果会比原数长度多一位,这是你已经考虑到的。不过,在这个地方:
numsum[i + 1] += numsum[i] / 10;
这里的
i + 1
可能会访问到未初始化的numsum[maxlen + 1]
,建议稍微修改下循环条件,确保不会越界,可以使用maxlen
来控制。3. 输出前可能出现空字符串的问题
在输出之前,你用了以下代码:
while(numsum[maxlen] == 0 && maxlen > 1) maxlen--;
这段代码的作用是去掉前导零,目的是为了避免像“000123”这样的输出问题。然而,如果两个输入数字相加的结果为
0
,这段代码可能会导致输出空字符串。你需要确保当结果为0
时正确输出。可以加上这样的判断:if (ans.empty()) ans = "0";
完整修正版
结合以上建议,修正后的代码如下:
#include <iostream> #include <algorithm> #include <string> #include <cstring> using namespace std; int main() { string n, m, ans; cin >> m >> n; int ml = m.size(), nl = n.size(); // 初始化数组 int num1[100001] = {0}, numsum[100001] = {0}, num2[100001] = {0}; // 将字符串数字从低位到高位存入数组 for (int i = 1; i <= ml; i++) num1[i] = m[ml - i] - '0'; for (int i = 1; i <= nl; i++) num2[i] = n[nl - i] - '0'; int maxlen = max(nl, ml) + 1; // 最大长度+1,用于处理可能的进位 for (int i = 1; i <= maxlen; i++) { numsum[i] += num2[i] + num1[i]; numsum[i + 1] += numsum[i] / 10; // 处理进位 numsum[i] %= 10; } // 去除前导零 while (numsum[maxlen] == 0 && maxlen > 1) maxlen--; // 构造结果字符串 for (int i = maxlen; i >= 1; i--) ans += numsum[i] + '0'; // 如果结果为空(说明相加结果是0),输出“0” if (ans.empty()) ans = "0"; cout << ans; }
总结:
- 数组初始化:未初始化的数组会导致不可预测的行为。
- 进位处理:注意进位时数组越界的问题。
- 前导零处理:避免相加结果为零时输出空字符串。
这样修改后,程序应该能够正确处理各种大整数的加法,包括一些特殊情况(例如两个零相加)。
2024-09-05 来自 浙江
0但是好像还是不对。
2024-09-05 来自 浙江
0
有帮助,赞一个