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

多项式相加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:08:15