二元多项式

Problem Description

给你多个二元多项式和一个操作符,让你输出操作符操作这些二元多项式之后的结果。

Input

首先输入二元多项式的个数n和操作符号(‘+’,‘*’);

后面n行输入每一个多项式。

多组输入,当n=0的时候结束输入。

(n<5,二元多项式的长度小于1000,二元多项式都是由x,y,^,数字,’+’组成的)

Output

输出操作之后的结果。

(输出的顺序按照:x2>x>xy2>xy>y^2>y>常数)

Sample Input
2 +
3x+4y2+3xy+6x10y^2+1
2x+6y
0
Sample Output
6x10y2+5x+3xy+4y^2+6y+1

这是一个典型的链表问题 可以加强我们对链表的认识
加法就是 将所有组 连起来 相同的多多项式加起来。
乘法 系数想成 指数相加

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

struct node //x y代表x,y的系数
{
    int x;
    int y;
    int num;
    node *next;
}head[10];
char c[3];
char str[1001];

node *creat()
{
    node *p;
    p=new node;
    p->num=0;
    p->x=0;
    p->y=0;
    p->next=NULL;
    return p;
}
void build(node *root) //倒序读数  便于操作
{
    node *p;
    p=creat();
    int len=strlen(str);
    int data=0;
    int ans=1;
    for(int i=len-1;i>=0;i--)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            data=(str[i]-'0')*ans+data;
            ans*=10;
        }
        else if(str[i]=='x')
        {
            if(data)
                p->x=data;
            else
                p->x=1;
            data=0;
            ans=1;
        }
        else if(str[i]=='y')
        {
            if(data)
                p->y=data;
            else
                p->y=1;
            data=0;
            ans=1;

        }
        else if(str[i]=='+')
        {
           if(data)
             p-> num=data;
           else if(p->x||p->y)
             p->num=1;
           p->next=root->next;
           root->next=p;
           data=0;
           ans=1;
           p=creat();
        }
    }
    if(data)
        p->num=data;
    else if(p->x||p->y)
        p->num=1;
    p->next=root->next;
    root->next=p;
}
void link(node *Root,node *root)//乘法运算
{
    node *p,*q,*temp,*t;
    temp=creat();
    p=Root->next;
    while(p)
    {
        q=root->next;
        while(q)
        {
            t=creat();
            t->num=p->num*q->num;
            t->y=p->y+q->y;
            t->x=p->x+q->x;
            t->next=temp->next;
            temp->next=t;
            q=q->next;
        }
        p=p->next;
    }
    Root->next=temp->next;
    free(temp);

}
void sorta(node *root)
{

    node *p,*q,*temp;
    p=root->next;
    while(p)//加法排序
    {
        temp=p;
        q=p->next;
        while(q)
        {
            if(p->x==q->x&&p->y==q->y&&p->num)
            {
                p->num+=q->num;
                temp->next=q->next;
                free(q);
                q=temp->next;
            }
            else if(p->num==0&&q->num==0)
            {
                p->x=0;
                p->y=0;
                temp->next=q->next;
                free(q);
                q=temp->next;

            }
            else
            {
                temp=temp->next;
                q=q->next;
            }
        }
        p=p->next;
    }
    p=root->next;
    while(p)//排序
    {
        q=p->next;
        while(q)
        {
            if(p->x<q->x)
            {
                swap(p->x,q->x);
                swap(p->y,q->y);
                swap(p->num,q->num);

            }
            else if(p->x==q->x&&p->x)
            {

                if(q->y==0&&p->y!=0)
                {
                swap(p->x,q->x);
                swap(p->y,q->y);
                swap(p->num,q->num);

                }
                else if(q->y>p->y&&p->y!=0)
                {
                swap(p->x,q->x);
                swap(p->y,q->y);
                swap(p->num,q->num);

                }
            }
            else if(p->x==q->x&&p->x==0)
            {
                if(p->y<q->y)
                {
                swap(p->x,q->x);
                swap(p->y,q->y);
                swap(p->num,q->num);
                }
            }
        q=q->next;

        }
    p=p->next;
    }
}

void  output(node *root)//输出
{
    node *p;
    p=root->next;
    while(p)
    {
        if(p!=root->next)
            printf("+");
        if(p->num)
        {
            if(p->num!=1||(p->x==0&&p->y==0))
                printf("%d",p->num);
        }
        else
            {
            printf("0");
            p=p->next;
            continue;
            }
        if(p->x)
        {
            printf("x");
            if(p->x!=1)
                printf("^%d",p->x);
        }
        if(p->y)
        {
            printf("y");
            if(p->y!=1)
                printf("^%d",p->y);
        }
        p=p->next;
    }
printf("\n");

}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)
            break;
        scanf("%s",&c);
        for(int i=0;i<=n;i++)
            head[i].next=NULL;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",str);
            build(&head[i]);
        }
        if(c[0]=='+')
        {
            node *p;
            p=&head[0];
            for(int i=1;i<=n;i++)
            {
                p->next=head[i].next;
                while(p->next)
                    p=p->next;
            }
        }
        else if(c[0]=='*')
        {
            head[0].next=head[1].next;
            for(int i=2;i<=n;i++)
            {
                link(&head[0],&head[i]);
            }

        }
    sorta(&head[0]);
    output(&head[0]);
    }
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值