多项式相加C++程序输出异常修复:解决向量越界问题
修复多项式相加的越界访问问题
你遇到的那些奇怪的乱码数值(比如1772060652x^4),本质是vector越界访问导致的未定义行为——当你循环到超过较短多项式项数的索引时,直接访问poly1[i]或poly2[i]会读取到内存里的随机垃圾值,而不是合法的系数。
问题根源
举个例子:如果第一个多项式只有3项(索引0、1、2),第二个有5项,当循环到i=3和4时,poly1[i]已经超出了它的有效范围,此时读取的是vector内存之外的随机数据,最终就会输出这些异常值。
两种修复方案
方案1:相加时判断索引合法性(推荐,无需修改原向量)
在计算每一项的和时,先检查当前索引是否在对应多项式的有效范围内,不在的话就用0代替(因为更高次项的系数默认是0):
修改相加的循环部分:
int sizeOfResult = max(poly1.size(), poly2.size()); vector<int> result(sizeOfResult); for(int i = 0; i<sizeOfResult; ++i) { // 当索引超出向量长度时,取0作为系数 int coeff1 = (i < poly1.size()) ? poly1[i] : 0; int coeff2 = (i < poly2.size()) ? poly2[i] : 0; result[i] = coeff1 + coeff2; }
方案2:将短多项式补0对齐长度
先把较短的vector扩展到和较长的一样长,并用0填充新增的位置,这样后续相加就不会有越界问题:
int sizeOfResult = max(poly1.size(), poly2.size()); // 把短向量补0到长向量的长度 poly1.resize(sizeOfResult, 0); poly2.resize(sizeOfResult, 0); vector<int> result(sizeOfResult); for(int i = 0; i<sizeOfResult; ++i) { result[i] = poly1[i] + poly2[i]; }
额外优化(可选)
为了让输出更专业,可以跳过系数为0的项(除非是常数项且系数为0),比如修改输出循环:
cout<<"Sum of the two polynomials: "; bool firstTerm = true; for(int i = 0; i<sizeOfResult; ++i) { if (result[i] == 0) continue; // 跳过系数为0的项 if (!firstTerm) cout << " + "; // 非首项前加加号 switch(i){ case 0: cout<<result[i]; break; case 1: cout<<result[i]<<"x"; break; default: cout<<result[i]<<"x^"<<i; break; } firstTerm = false; } // 如果所有项都是0,输出0 if (firstTerm) cout << 0; cout << endl;
修复后的完整代码(方案1+优化输出)
#include <cstdlib> #include <iostream> #include <string> #include <vector> #include <numeric> #include <cmath> using namespace std; int main() { int sizeOfPoly1; cout<<"Size of first polynomial: "; cin>>sizeOfPoly1; vector<int> poly1(sizeOfPoly1); cout<<"constant ="; cin>>poly1[0]; for (int i = 1; i <= (sizeOfPoly1-1); ++i) { cout<<"Insert x^"<<i<<": "; cin>>poly1[i]; } int sizeOfPoly2; cout<<"Size of second polynomial: "; cin>>sizeOfPoly2; vector<int> poly2(sizeOfPoly2); cout<<"constant ="; cin>>poly2[0]; for (int i = 1; i <= (sizeOfPoly2-1); ++i) { cout<<"Insert x^"<<i<<": "; cin>>poly2[i]; } int sizeOfResult = max(poly1.size(), poly2.size()); vector<int> result(sizeOfResult); for(int i = 0; i<sizeOfResult; ++i) { int coeff1 = (i < poly1.size()) ? poly1[i] : 0; int coeff2 = (i < poly2.size()) ? poly2[i] : 0; result[i] = coeff1 + coeff2; } cout<<"Sum of the two polynomials: "; bool firstTerm = true; for(int i = 0; i<sizeOfResult; ++i) { if (result[i] == 0) continue; if (!firstTerm) cout << " + "; switch(i){ case 0: cout<<result[i]; break; case 1: cout<<result[i]<<"x"; break; default: cout<<result[i]<<"x^"<<i; break; } firstTerm = false; } if (firstTerm) cout << 0; cout << endl; return 0; }
这样修改后,不管两个多项式项数差异多大,都不会再出现异常的垃圾值,输出也会更整洁。
内容的提问来源于stack exchange,提问作者crystyxn
相关产品推荐
相关产品推荐

