二元多项式

二元多项式

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

 

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

输入

 

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

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

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

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

输出

 

输出操作之后的结果。

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

示例输入

2 +
3x+4y^2+3xy+6x^10y^2+1
2x+6y
0

示例输出

6x^10y^2+5x+3xy+4y^2+6y+1

提示

 

来源

 zp

示例程序

 
#include <cstdio>  
#include <cstring>  
#include <cstdlib>  
#include <iostream>  
#include <algorithm>  
using namespace std;  
char sen[1010];  
struct N  
{  
    int x1,x2,y1,y2;  
    struct N *next;  
} mark[1010];  
  
N *creat()  
{  
    N *p = (struct N *)malloc(sizeof(struct N));  
    p->next = NULL;  
    return p;  
}  
  
void insert_mul(N *head,N *p)  
{  
    p->next = head->next;  
    head->next = p;  
}  
  
void insert_add(N *head,N *p)  
{  
    N *q1 = head;  
    N *q2 = head->next;  
    while(q2 != NULL)  
    {  
        if(q2->x2 == p->x2 && q2->y2 == p->y2)  
        {  
            q2->x1 += p->x1;  
            return ;  
        }  
        if(p->x2 != 0 || p->y2 != 0)  
        {  
  
            if(q2->x2 < p->x2)  
            {  
                break;  
            }  
            else if(q2->x2 == p->x2)  
            {  
                if(p->y2 == 0)  
                    break;  
                else if(q2->y2 < p->y2 && ( q2->y2 != 0 || (q2->x2 == 0 && q2->y2 == 0) ) )  
                    break;  
            }  
        }  
        q1 = q1->next;  
        q2 = q2->next;  
    }  
    p->next = q1->next;  
    q1->next = p;  
}  
  
int cal(char *s)  
{  
    int ans,sum,l;  
    for(ans = 1,sum = 0,l = strlen(s) - 1; l >= 0; l--)  
    {  
        sum += ans*(s[l]-'0');  
        ans *= 10;  
    }  
    return sum;  
}  
  
void check_number(char *s,char order,struct N *head)  
{  
    char num[30];  
    int mark,top;  
    int ans;  
    int i,l;  
    N *p = creat();  
    p->x1 = 0;  
    p->x2 = 0;  
    p->y1 = 0;  
    p->y2 = 0;  
    for(mark = 1,ans = 1,i = 0,l = strlen(s),top = 0; i <= l; i++)  
    {  
        if(i != l && '0' <= s[i] && s[i] <= '9')  
        {  
            num[top++] = s[i];  
        }  
        else  
        {  
            num[top] = '\0';  
  
            if(top != 0)  
            {  
                if(mark == 1)  
                {  
                    p->x1 = cal(num);  
                }  
                else if(mark == 2)  
                {  
                    p->x2 = cal(num);  
                }  
                else if(mark == 3)  
                {  
                    p->y1 = cal(num);  
                }  
                else if(mark == 4)  
                {  
                    p->y2 = cal(num);  
                }  
            }  
            top = 0;  
            if(s[i] == 'y')  
                mark = 3;  
            else if(s[i] == '^')  
                mark++;  
        }  
    }  
    if(p->x2 == 0)  
    {  
        for(i = 0; i < l; i++)  
        {  
            if(s[i] == 'x')  
            {  
                p->x2 = 1;  
                break;  
            }  
        }  
    }  
    if(p->y2 == 0)  
    {  
        for(i = 0; i < l; i++)  
        {  
            if(s[i] == 'y')  
            {  
                p->y2 = 1;  
                break;  
            }  
        }  
    }  
    if(p->x1 == 0)  
    {  
        if(p->x2 != 0 || p->y2 != 0)  
            p->x1 = 1;  
    }  
    if(order == '+')  
    {  
        insert_add(head,p);  
    }  
    else insert_mul(head,p);  
}  
  
void analysis(char order,N *head)  
{  
    int i,l,top;  
    char s[50];  
    for(top = 0,i = 0,l = strlen(sen); i < l; i++)  
    {  
        if(sen[i] == '+')  
        {  
            s[top] = '\0';  
            check_number(s,order,head);  
            top = 0;  
        }  
        else  
        {  
            s[top++] = sen[i];  
        }  
    }  
    s[top] = '\0';  
    check_number(s,order,head);  
}  
  
void output(N *head)  
{  
    N *p = head->next;  
    bool mark = false;  
    if(p != NULL)  
    {  
        if(p->x2 == 0 && p->y2 == 0 && p->x1 != 0)  
        {  
            cout<<p->x1;  
            mark = true;  
        }  
        else if(p->x1 != 0)  
        {  
            mark = true;  
            if(p->x1 != 1)  
            {  
                cout<<p->x1;  
            }  
            if(p->x2 != 0)  
            {  
                cout<<'x';  
            }  
            if(p->x2 > 1)  
            {  
                cout<<'^'<<p->x2;  
            }  
            if(p->y2 != 0)  
            {  
                cout<<'y';  
            }  
            if(p->y2 > 1)  
            {  
                cout<<'^'<<p->y2;  
            }  
        }  
    }  
    else return ;  
    for(p = p->next ; p != NULL; p = p->next)  
    {  
  
        if(p->x2 == 0 && p->y2 == 0 && p->x1 != 0)  
        {  
            mark = true;  
            cout<<'+';  
            cout<<p->x1;  
        }  
        else if(p->x1 != 0)  
        {  
            mark = true;  
            cout<<'+';  
            if(p->x1 != 1)  
            {  
                cout<<p->x1;  
            }  
            if(p->x2 != 0)  
            {  
                cout<<'x';  
            }  
            if(p->x2 > 1)  
            {  
                cout<<'^'<<p->x2;  
            }  
            if(p->y2 != 0)  
            {  
                cout<<'y';  
            }  
            if(p->y2 > 1)  
            {  
                cout<<'^'<<p->y2;  
            }  
        }  
    }  
    if(mark == false)  
        cout<<0;  
    cout<<endl;  
}  
  
void multi(N *head[20],int n)  
{  
    N *p,*q;  
    int i;  
  
    for(i = 1; i < n; i++)  
    {  
        head[n+i-1] = creat();  
  
        if(i == 1)  
        {  
            p = head[0]->next;  
        }  
        else p = head[n+i-2]->next;  
        for(; p != NULL; p = p->next)  
        {  
            for(q = head[i]->next; q != NULL; q = q->next)  
            {  
                N *temp = creat();  
                temp->x1 = q->x1 * p->x1;  
                temp->x2 = q->x2 + p->x2;  
                temp->y1 = 0;  
                temp->y2 = q->y2 + p->y2;  
                insert_add(head[n+i-1],temp);  
            }  
        }  
    }  
    output(head[n+i-2]);  
}  
  
int main()  
{  
    int i,n;  
    char ch;  
    while(cin>>n && n)  
    {  
        N *head[20];  
        for(i = 0; i < n; i++)  
        {  
            head[i] = creat();  
        }  
        cin>>ch;  
  
        memset(mark,0,sizeof(mark));  
  
        for(i = 0; i <  n; i++)  
        {  
            cin>>sen;  
            if(ch == '*')  
            {  
                analysis(ch,head[i]);  
            }  
            else analysis(ch,head[0]);  
        }  
  
        if(ch == '+')  
        {  
            output(head[0]);  
        }  
        else if(ch == '*')  
        {  
            multi(head,n);  
        }  
    }  
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值