C++数组指针实现大整数加法进位输出错误问题排查
大整数加法故障修复
问题背景
- 作业目标:实现名为
largeIntegers的类,支持任意位数整数的存储,提供两个大整数之间的加、减、乘、比较运算,配套构造初始化、值设置、值获取、打印功能,最终完成类功能测试。 - 当前故障:加法逻辑存在错误,当两个整数最高位相加产生≥10的进位时,无法正确输出最高位的进位1,测试用例
805 + 805返回错误结果610。
故障根因
- 进位方向逻辑错误:加法从低位(数组索引0位)往高位计算时,进位应该传递给索引+1的更高位,现有代码错误写为
resultPtr[a-1] += 1,把进位加到了更低的位,直接导致数值计算错乱。 - 动态申请的数组未初始化:通过
new int[SIZE]申请的内存没有做清零操作,数组元素初始为随机垃圾值,会直接干扰运算结果。 - 最高位进位未纳入输出:循环仅遍历到两个输入数的最长长度位置,若最高位计算后产生进位,没有处理剩余的进位值,也没有把该位纳入输出范围。
- 数字存储逻辑越界:
setNum1、setNum2的循环条件为0 <= x,当x递减到0时会访问下标为-1的数组内存,属于非法越界操作。 - 不符合动态大整数设计要求:当前固定使用长度为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
相关产品推荐
相关产品推荐

