viency13 2023-06-06 10:16 采纳率: 68.8%
浏览 22

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

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

输入格式:
输入分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;
}
  • 写回答

1条回答 默认 最新

  • Leodong. 2023-06-06 10:52
    关注

    该回答通过自己思路及引用到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;
    }
    

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

    评论

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘
  • ¥15 抖音直播广场scheme
  • ¥15 为什么我明明有这个文件调试器还显示错误?
  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库