全部评论 3

  • 把while改成if

    5天前 来自 江苏

    0
  • 笑点解析:最后一个测试点有前导零不能去掉

    2024-09-05 来自 广东

    0
  • GPT-4o回复:

    这段代码有以下几个潜在问题和可以改进的地方:

    1. 数组初始化问题

    代码中定义了num1[], num2[]numsum[]这三个数组,但它们没有被初始化,导致后续操作时可能会包含随机值。C++中,局部数组的默认值是未定义的,所以需要手动将这些数组的每个元素初始化为0。可以通过如下方式修正:

    int num1[100001] = {0}, numsum[100001] = {0}, num2[100001] = {0};
    

    2. 进位计算逻辑问题

    当前代码在加法过程中,使用的maxlenmax(nl, ml) + 1,这是正确的,因为在加法过程中可能会出现进位。但在主循环中,nums的长度应是从1maxlen的。如果两个数的最高位有进位,则最终结果会比原数长度多一位,这是你已经考虑到的。

    不过,在这个地方:

    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;
    }
    

    总结:

    1. 数组初始化:未初始化的数组会导致不可预测的行为。
    2. 进位处理:注意进位时数组越界的问题。
    3. 前导零处理:避免相加结果为零时输出空字符串。

    这样修改后,程序应该能够正确处理各种大整数的加法,包括一些特殊情况(例如两个零相加)。

    2024-09-05 来自 浙江

    0

热门讨论