You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组指针实现大整数加法进位输出错误问题排查

大整数加法故障修复

问题背景

  • 作业目标:实现名为largeIntegers的类,支持任意位数整数的存储,提供两个大整数之间的加、减、乘、比较运算,配套构造初始化、值设置、值获取、打印功能,最终完成类功能测试。
  • 当前故障:加法逻辑存在错误,当两个整数最高位相加产生≥10的进位时,无法正确输出最高位的进位1,测试用例805 + 805返回错误结果610。

故障根因

  1. 进位方向逻辑错误:加法从低位(数组索引0位)往高位计算时,进位应该传递给索引+1的更高位,现有代码错误写为resultPtr[a-1] += 1,把进位加到了更低的位,直接导致数值计算错乱。
  2. 动态申请的数组未初始化:通过new int[SIZE]申请的内存没有做清零操作,数组元素初始为随机垃圾值,会直接干扰运算结果。
  3. 最高位进位未纳入输出:循环仅遍历到两个输入数的最长长度位置,若最高位计算后产生进位,没有处理剩余的进位值,也没有把该位纳入输出范围。
  4. 数字存储逻辑越界:setNum1、setNum2的循环条件为0 <= x,当x递减到0时会访问下标为-1的数组内存,属于非法越界操作。
  5. 不符合动态大整数设计要求:当前固定使用长度为25的定长数组,无法支持任意长度的整数存储,且动态申请的内存没有对应释放逻辑,存在内存泄漏。

修复后代码

largeIntegers.h

#ifndef H_largeIntegers
#define H_largeIntegers  
#include <string>

static const int BASE_SIZE = 25;

class largeIntegers{
    public:
        void setNum1(std::string num1);
        void setNum2(std::string num2);
        void subtract();
        void multiply();
        void compare();
        void printLists();
        void add();
        largeIntegers(std::string num1 = "10", std::string num2 = "10");
        ~largeIntegers(); // 新增析构函数释放内存

    private:
        int *num1Ptr = nullptr;
        int *num2Ptr = nullptr;
        int *resultPtr = nullptr;
        int x1 = 0; // 第一个数的长度
        int x2 = 0; // 第二个数的长度
};
#endif

largeIntegers.cpp

#include <iostream>
#include <string>
#include <algorithm>
#include "largeIntegers.h"
using namespace std;

largeIntegers::~largeIntegers() {
    delete[] num1Ptr;
    delete[] num2Ptr;
    delete[] resultPtr;
}

void largeIntegers::setNum1(string num1){
    x1 = num1.size();
    delete[] num1Ptr;
    num1Ptr = new int[BASE_SIZE](); // 括号初始化数组全为0
    for(int i = 0; i < x1; i++){
        // 数组低位存数字低位,索引0存个位,索引1存十位...
        num1Ptr[i] = num1[x1 - 1 - i] - '0';
    }
}

void largeIntegers::setNum2(string num2){
    x2 = num2.size();
    delete[] num2Ptr;
    num2Ptr = new int[BASE_SIZE]();
    for(int i = 0; i < x2; i++){
        num2Ptr[i] = num2[x2 - 1 - i] - '0';
    }
}

void largeIntegers::add(){
    delete[] resultPtr;
    resultPtr = new int[BASE_SIZE](); // 结果数组初始全0
    int carry = 0; // 进位值,初始为0
    int longest = max(x1, x2);
    int maxIndex = 0;

    for(int i = 0; i < longest || carry; i++){
        int sum = carry;
        if(i < x1) sum += num1Ptr[i];
        if(i < x2) sum += num2Ptr[i];
        resultPtr[i] = sum % 10;
        carry = sum / 10;
        maxIndex = i;
    }

    // 从最高位往低位打印结果
    for(int i = maxIndex; i >= 0; i--){
        cout << resultPtr[i];
    }
    cout << endl;
}

void largeIntegers::subtract(){
    // 待实现
}
void largeIntegers::multiply(){
    // 待实现
};
void largeIntegers::compare(){
    // 待实现
};

void largeIntegers::printLists(){
    for (int a = x1 - 1; a >= 0; a--) {
        cout << num1Ptr[a];
    }
    cout << endl;
    for (int b = x2 - 1; b >= 0; b--) {
        cout << num2Ptr[b];
    }
    cout << endl;
}

largeIntegers::largeIntegers(string num1, string num2){
    setNum1(num1);
    setNum2(num2);
}

main.cpp

#include <iostream>
#include "largeIntegers.h"
using namespace std;

int main(){
    string num1, num2;
    cout<< "Enter the first integer" << endl;
    cin >> num1;
    cout<< "Enter the second integer" << endl;
    cin >> num2;
    largeIntegers customList(num1, num2);

    cout << "The numbers entered are "<< endl;
    customList.printLists();
    cout << "When added together they equal " << endl;
    customList.add();
    cout << "The bigger integer minus the shorter integer is " << endl;
    customList.subtract();

    return 0;
}

扩展优化提示

如果要实现任意长度大整数支持,可以把固定长度数组替换为vector<int>动态数组,运算时根据数字长度自动扩容,不需要提前限制固定SIZE大小。


内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:27:30