• 3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)


    题目链接:http://pat.zju.edu.cn/contests/ds/3-04


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

    输入格式说明:

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

    输出格式说明:

    输出分2行。分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。

    数字间以空格分隔,但结尾不能有多余空格。

    例子输入与输出:

    序号 输入 输出
    1
    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
    
    2
    2 1 2 1 0
    2 1 2 -1 0
    
    1 4 -1 0
    2 2
    
    3
    2 -1000 1000 1000 0
    2 1000 1000 -1000 0
    
    -1000000 2000 2000000 1000 -1000000 0
    0 0
    
    4
    0
    1 999 1000
    
    0 0
    999 1000

    代码例如以下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    const int maxn = 5217;
    typedef struct
    {
        int x, y;
        int m, s;
    } node;
    node num1[maxn], num2[maxn];
    node ans_mul[maxn], ans_sum[maxn];
    int max1, max2, maxx;
    
    void mult()
    {
        for(int i = 0; i <= max1; i++)
        {
            for(int j = 0; j <= max2; j++)
            {
                ans_mul[i+j].m += num1[i].x*num2[j].x;
            }
        }
    }
    
    void sum()
    {
        for(int i = 0; i <= maxx; i++)
        {
            ans_sum[i].s += num1[i].x + num2[i].x;
        }
    }
    int main()
    {
        int n, m;
        scanf("%d",&n);
        int t1, t2;
        max1 = max2 = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d %d",&t1,&t2);
            if(t2 > max1)
                max1 = t2;
            num1[t2].x = t1;
        }
        scanf("%d",&m);
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d",&t1,&t2);
            if(t2 > max2)
                max2 = t2;
            num2[t2].x = t1;
        }
        int mul_max = max1+max2;
        maxx = max(max1, max2);
        mult();
        sum();
        int flag = 0;
        for(int i = mul_max; i >= 0; i--)
        {
            if(!ans_mul[i].m)
            {
                continue;
            }
            if(!flag)
            {
                printf("%d %d",ans_mul[i].m,i);
                flag = 1;
            }
            else
            {
                printf(" %d %d",ans_mul[i].m,i);
            }
        }
        if(!flag)
        {
            printf("0 0");
        }
        printf("
    ");
        flag = 0;
        for(int i = maxx; i >= 0; i--)
        {
            if(!ans_sum[i].s)
            {
                continue;
            }
            if(!flag)
            {
                printf("%d %d",ans_sum[i].s,i);
                flag = 1;
            }
            else
            {
                printf(" %d %d",ans_sum[i].s,i);
            }
        }
        if(!flag)
        {
            printf("0 0");
        }
        printf("
    ");
        return 0;
    }
    


  • 相关阅读:
    C语言版本:单链表的实现(优化版本)
    C语言版本:单链表的实现
    C语言版本:顺序表的实现
    C++:多态浅析
    C++:同名隐藏和赋值兼容规则
    C++:钻石继承与虚继承
    C++:派生类的构造函数和析构函数的调用顺序
    Docker安装和使用
    Node10.15.0的安装
    碎碎叨叨
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5184265.html
Copyright © 2020-2023  润新知