一元多项式的乘法与加法运算(数组+排序)

在这里插入图片描述

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>

using namespace std;

#define MAXN 1005

struct node
{
    int a;
    int x;
}date1[MAXN],date2[MAXN],datet[MAXN*2],date;

priority_queue<node>q;

bool operator < (node a,node b)
{
    return a.x < b.x;    
} 
bool cmp(node a,node b)
{
    return a.x > b.x;
}

int main()
{
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    int N1,N2,N;
    int i,j,t = 1;
    int aa,ax;
    int ba,bx;
    int ta;
    bool flag = false;
    
    scanf("%d",&N1);
    for(i = 1;i<=N1;i++)
    {
        scanf("%d%d",&date1[i].a,&date1[i].x);
        datet[t].a = date1[i].a;
        datet[t].x = date1[i].x;
        t++;
    }
    scanf("%d",&N2);
    for(i = 1;i<=N2;i++)
    {
        scanf("%d%d",&date2[i].a,&date2[i].x);
        datet[t].a = date2[i].a;
        datet[t].x = date2[i].x;
        t++;
    }
    
    for(i = 1;i<=N1;i++)
    {
        for(j = 1;j<=N2;j++)
        {
            date.x = date1[i].x+date2[j].x;
            date.a = date1[i].a*date2[j].a;
            q.push(date);
        }
    }
    //注意:输出空格时,要注意检查是否存在下一项
    while(!q.empty())
    {
        aa = q.top().a;
        ax = q.top().x;
        q.pop();
        if(q.empty())
        {
            if(aa)
            {
                printf("%d %d",aa,ax);
                flag = true;
            }
            continue;
        }
        ba = q.top().a;
        bx = q.top().x;
        q.pop();
        if(ax==bx)
        {
            date.x = ax;
            date.a = aa + ba;
            if(date.a)
                q.push(date);
            continue;
        }
        else
        {
            printf("%d %d",aa,ax);
            date.x = bx;
            date.a = ba;
            q.push(date);
            flag = true;
        }
        if(!q.empty())
            printf(" ");
    }
    
    
    if(flag==false) 
        printf("0 0");
    printf("\n");
    
    flag = false;
    
    N = N1 + N2;
    sort(datet + 1,datet + 1 + N,cmp);
    for(i = 1;i<=N;i++)
    {
        if(i<N)
        {
            if(datet[i].x==datet[i+1].x)
            {
                ta = datet[i].a + datet[i+1].a;
                if(ta)
                {
                    printf("%d %d",ta,datet[i].x);
                    flag = true;
                }
                i ++;
            }
            else
            {
                printf("%d %d",datet[i].a,datet[i].x);
                flag = true;
            }
        }
        else if(datet[i].a)
        {
            printf("%d %d",datet[i].a,datet[i].x);
            flag = true;
        }
        
        if(i<N&&flag==true)
        {
            if(datet[i+1].x==datet[i+2].x)
            {
                ta = datet[i+1].a + datet[i+2].a;
                if(ta)
                {
                    printf(" ");
                }
            }
            else if(datet[i+1].a)
            {
                printf(" ");
            }
        }
    }
    
    
    if(flag == false)
        printf("0 0");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39592312/article/details/104566450