测试点同类项合并时有抵消过不去,格式错误

设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0


#include <iostream>
using namespace std;

typedef struct
{
    int x;
    int z;
}Sqlist;

int main ()
{
    int n, m;
    cin >> n;
    Sqlist a[n];
    for ( int i = 0; i < n; i ++ )
    {
        cin >> a[i].x >> a[i].z;
    }
    cin >> m;
    Sqlist b[m];
    for ( int i = 0; i < m; i ++ )
    {
        cin >> b[i].x >> b[i].z;
    }
    //求积,每一项分别相乘
    Sqlist c[m*n];
    int k = 0;
    for ( int i = 0; i < n; i ++ )
    {
        if ( a[i].x != 0 )
        {
            for ( int j = 0; j < m; j ++ )
            {
                if ( b[j].x != 0 )
                {
                    c[k].x = a[i].x * b[j].x;
                    c[k].z = a[i].z + b[j].z;
                    k ++;
                }
            }
        }
    }
    //按指数从大到小排序
    Sqlist t;
    for ( int i = 0; i < k - 1; i ++ )
    {
        for ( int j = i+1; j < k; j ++ )
        {
            if ( c[i].z <= c[j].z )
            {
                t = c[i];
                c[i] = c[j];
                c[j] = t;
            } 
        }
    }
    //合并指数相同的
    for ( int i = 0; i < k - 1; i ++ )
    {
        if ( c[i].z == c[i+1].z )
        {
            c[i+1].x = c[i].x + c[i+1].x;
            c[i].x = 0;
        }
    }
    //输出积
    int flag = 0;
    for ( int i = 0; i < k; i ++ )
    {
        if ( c[i].x != 0 )
        {
            cout << c[i].x << " " << c[i].z;
            if ( i < k-1 )
            {
                cout << " ";
            }
            flag ++;
        }
    }
    if ( flag == 0 )
    {
        cout <<"0 0";
    }
    cout << endl;
    //求和
    Sqlist d[m+n];
    int g = 0;
    //先将两个多项式都放入d[];
    for ( int i = 0; i < n; i ++ )
    {
        d[g].x = a[i].x;
        d[g].z = a[i].z;
        g ++; 
    }
    for ( int i = 0; i < m; i ++ )
    {
        d[g].x = b[i].x;
        d[g].z = b[i].z;
        g ++;
    }
    //按指数从大到小排序
    for ( int i = 0; i < g - 1; i ++ )
    {
        for ( int j = i+1; j < g; j ++ )
        {
            if ( d[i].z < d[j].z )
            {
                t = d[i];
                d[i] = d[j];
                d[j] = t;
            } 
        }
    }
    //合并指数相同的
    for ( int i = 0; i < g-1; i ++ )
    {
        if ( d[i].z == d[i+1].z )
        {
            d[i+1].x = d[i].x + d[i+1].x;
            d[i].x = 0;
        }
    }
    //输出和
    flag = 0;
    for ( int i = 0; i < g; i ++ )
    {
        if ( d[i].x != 0 )
        {
            cout << d[i].x << " " << d[i].z;
            if ( i < g - 1 )
            {
                cout << " ";
            }
            flag ++;
        }
    }
    if ( flag == 0 )
    {
        cout <<"0 0";
    }
    return 0;
}

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在同类项合并的部分,你需要保证当两个项的指数相同时,它们能够正确地相加。在你的代码中,你先将第一个项的系数置为 0,然后将第二个项的系数与第一个项的系数相加,这样会导致第二个项的系数被更新为相加后的值。但是,如果第三个项的指数与第一个项的指数相同,而第二个项的指数与第一个项的指数不同,那么在将第三个项的系数与第二个项的系数相加时,第二个项的系数已经被更新为相加后的值,导致计算错误。

为了避免这种情况,你可以将同类项相加后的结果暂存在一个新的数组中,最后将新数组中指数不为 0 的项输出即可。

此外,在输出结果时,你需要保证最后一项后面没有多余的空格,可以在循环内部判断是否为最后一项,如果不是,则输出空格,否则不输出。

下面是修改后的代码:

#include <iostream>
using namespace std;

typedef struct {
    int x;
    int z;
} Sqlist;

int main() {
    int n, m;
    cin >> n;
    Sqlist a[n];
    for (int i = 0; i < n; i++) {
        cin >> a[i].x >> a[i].z;
    }
    cin >> m;
    Sqlist b[m];
    for (int i = 0; i < m; i++) {
        cin >> b[i].x >> b[i].z;
    }

    //求积,每一项分别相乘
    Sqlist c[m * n];
    int k = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            c[k].x = a[i].x * b[j].x;
            c[k].z = a[i].z + b[j].z;
            k++;
        }
    }

    //按指数从大到小排序
    for (int i = 0; i < k - 1; i++) {
        for (int j = i + 1; j < k; j++) {
            if (c[i].z < c[j].z) {
                swap(c[i], c[j]);
            }
        }
    }

    //合并同类项
    Sqlist d[m * n];
    int g = 0;
    for (int i = 0; i < k; i++) {
        if (c[i].x != 0) {
            d[g] = c[i];
            for (int j = i + 1; j < k; j++) {
                if (c[j].z == c[i].z) {
                    d[g].x += c[j].x;
                    c[j].x = 0;
                }
            }
            i = g++;
        }
    }

    //输出积
    if (g == 0) {
        cout << "0 0" << endl;
    } else {
        for (int i = 0; i < g; i++) {
            cout << d[i].x << " " << d[i].z;
            if (i != g - 1) {
                cout << " ";
            }
        }
        cout << endl;
    }

    //求和
    g = 0;
    for (int i = 0; i < n; i++) {
        d[g] = a[i];
        g++;
    }
    for (int i = 0; i < m; i++) {
        d[g] = b[i];
        g++;
    }

    //按指数从大到小排序
    for (int i = 0; i < g - 1; i++) {
        for (int j = i + 1; j < g; j++) {
            if (d[i].z < d[j].z) {
                swap(d[i], d[j]);
            }
        }
    }

    //合并同类项
    int h = 0;
    for (int i = 0; i < g; i++) {
        if (d[i].x != 0) {
            int sum = d[i].x;
            for (int j = i + 1; j < g; j++) {
                if (d[j].z == d[i].z) {
                    sum += d[j].x;
                    d[j].x = 0;
                }
            }
            cout << sum << " " << d[i].z;
            h++;
            if (h != g - 1) {
                cout << " ";
            }
        }
    }
    if (h == 0) {
        cout << "0 0";
    }
    return 0;
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢