zoukankan      html  css  js  c++  java
  • 【7003】&&【a203】合并多项式

    Time Limit: 3 second
    Memory Limit: 2 MB

    问题描述
         求两个一元多项式的和。输入多项式方式为:多项式项数、每项系数和指数,按指数从大到小的顺序输入。输出多项式方式为:多项式项数、每项系数和指数,按指数从大到小的顺序输出,合并后的系数如果为0,则不输出该项。(假设系数、指数均为整数)

    Input

        输入n+m+2行,第一行输入为第一个多项式的项数n,接下来的n行的是第一个多项式的系数和指数。接着是第二个多项式的项数m,接下来的m行是第二个多项式的系数和指数。(系数与指数用一个空格隔开)

    Output

        输出若干行,第一行是合并后多项式的项数K,接下来的K行是每行多项式的系数和指数。(系数与指数用一个空格隔开)

    Sample Input

        4
        -5 6
        3 2
        1 1
        8 0
        5
        8 9
        6 6
       -3 2
       5 1
       -20 0
    

    Sample Output

        4
        8 9
        1 6
        6 1
        -12 0
    

    【题解】

    设置一个bo,数组,用来存指数为x的系数bo[x]。输入x,y 令bo[y]+=x即可,要注意y可能为负数,所以要设置一个zbo 和fbo数组,表示y是整数和负数的情况。

    最后从一个很大的数递减到0,遇到bo[i]!=0 就输出 bo[i] 和i即可。然后是负数 ,从1到一个很大的数进行输出 遇到bo[i]!=0,输出bo[i]和-i;

    【代码】

    #include <cstdio>
    #include <cstring>
    
    int n,m,zbo[100000],fbo[100000],num = 0;
    
    void input_data()
    {
        memset(zbo,0,sizeof(zbo));
        memset(fbo,0,sizeof(fbo));//memset函数用于初始化,头文件是cstring
        scanf("%d",&n); //输入第一个多项式的项数
        for (int i = 1;i <= n;i++) //依次输入n个项
            {
                int x,y;
                scanf("%d %d",&x,&y);
                if (y >= 0)
                    zbo[y] += x;
                        else
                            fbo[-y] += x;
            }
        scanf("%d",&m); //输入第二个多项式的项数
        for (int i = 1;i <= m;i++) //依次输入m个项
            {
                int xx,yy;
                scanf("%d %d",&xx,&yy);
                if (yy >= 0)
                    zbo[yy] += xx;
                        else
                            fbo[-yy] += xx;
            }
    }
    
    void output_ans()
    {
        for (int i = 99999;i >= 0;i--) //先要统计要输出的个数。
            if (zbo[i] != 0)
                num++;
        for (int i = 1;i <=99999;i++)
            if (fbo[i] != 0)
                num++;
    
        printf("%d
    ",num);
    
        for (int i = 99999;i >= 0;i--) //输出完个数之后再输出具体的项。
            if (zbo[i] != 0)
                printf("%d %d
    ",zbo[i],i);
        for (int i = 1;i <=99999;i++)
            if (fbo[i] != 0)
                printf("%d %d
    ",fbo[i],-i);
    }
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        input_data();
        output_ans();
        return 0;
    }
    


     

    【代码】

  • 相关阅读:
    Distinct Substrings(spoj 694)
    Musical Theme
    Milk Patterns(poj 3261)
    Repeated Substrings(UVAlive 6869)
    喵星球上的点名(bzoj 2754)
    滑雪与时间胶囊(bzoj 2753)
    莫比乌斯函数之和(51nod 1244)
    欧拉函数之和(51nod 1239)
    数表(bzoj 3529)
    欧拉函数模板
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632426.html
Copyright © 2011-2022 走看看