sdut 1482 二元多项式

二元多项式

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

提示

这题是比较复杂的模拟题,但还是没有pta上的求后缀式那题恶心,比较难过的数据一般是特殊情况,做测试数据时多往这方面想(个人觉得),这也是我用C++写的第一篇博客。
我用的是结构体,这是链表做的-> http://blog.csdn.net/qq_33435265/article/details/51959208(看了一眼链表更复杂就放弃了) 。
代码很长,注释可能写的不全,有耐心看完的童鞋表示佩服。

来源

 zp

示例程序

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct num
{
    int k,x,y;
} a[5][4000];		//k为系数,x为x的指数,y为y的指数,结构体存下每个多项式的每一项
int cmp(struct num x,struct num y)
{
    if(x.x>y.x)
    {
        return 1;
    }
    else if(x.x==y.x&&x.y>y.y)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    char c[2],ch[1000];
    int n,i,top[5],i1,i2,flag;		//top数组记录每个多项式项的个数
    scanf("%d",&n);
    while(n!=0)
    {
        scanf("%s",c);
        memset(a,0,sizeof(a));		//初始化一下是有必要的
        for(i=0; n>i; i++)
        {
            scanf("%s",ch);
            top[i]=0;
            for(i1=0; ch[i1]!='\0';)
            {
                if('0'<=ch[i1]&&ch[i1]<='9'&&(i1==0||ch[i1-1]=='+'))		//提取系数
                {
                    for(i2=1; '0'<=ch[i1]&&ch[i1]<='9'; i1++)
                    {
                        a[i][top[i]].k=a[i][top[i]].k*i2+(ch[i1]-'0');
                        i2=10;
                    }
                }
                else if(ch[i1]=='x')						//提取x的指数
                {
                    i1++;
                    if(ch[i1]=='^')
                    {
                        i1++;
                        for(i2=1; '0'<=ch[i1]&&ch[i1]<='9'; i1++)
                        {
                            a[i][top[i]].x=a[i][top[i]].x*i2+(ch[i1]-'0');
                            i2=10;
                        }
                    }
                    else		//没有'^'的话说明x的指数为1
                    {
                        a[i][top[i]].x=1;
                    }
                    if(a[i][top[i]].k==0)		//因为系数为1的带有未知数的一项系数省略不写,需要提取出来
                    {
                        a[i][top[i]].k=1;
                    }
                }
                else if(ch[i1]=='y')		//这里和x一样,只是未知数为y
                {
                    i1++;
                    if(ch[i1]=='^')
                    {
                        i1++;
                        for(i2=1; '0'<=ch[i1]&&ch[i1]<='9'; i1++)
                        {
                            a[i][top[i]].y=a[i][top[i]].y*i2+(ch[i1]-'0');
                            i2=10;
                        }
                    }
                    else
                    {
                        a[i][top[i]].y=1;
                    }
                    if(a[i][top[i]].k==0)
                    {
                        a[i][top[i]].k=1;
                    }
                }
                else			//遇到加号表示已提取完多项式的其中一项
                {
                    top[i]++;
                    i1++;
                }
            }
        }
        if(c[0]=='*')		//运算符为乘号时需要单独判断n个多项式中是否有为0的多项式,因为0乘任何数为0 ( ⊙ o ⊙ )啊!
        {
            for(i=0; n>i; i++)
            {
                flag=0;
                for(i1=0; top[i]>=i1; i1++)
                {
                    if(a[i][i1].k!=0)
                    {
                        flag++;
                    }
                }
                if(flag==0)
                {
                    break;
                }
            }
        }
        if(c[0]=='+')
        {
            for(i=1; n>i; i++)
            {
                for(i1=0; top[i]>=i1; i1++)
                {
                    for(i2=0; top[0]>=i2; i2++)			//a[0]做运算
                    {
                        if(a[i][i1].k==0)		//这项为0就不用算了
                        {
                            break;
                        }
                        else if(a[0][i2].x==a[i][i1].x&&a[0][i2].y==a[i][i1].y)		//多项式运算的法则,这里不过多叙述
                        {
                            a[0][i2].k=a[0][i2].k+a[i][i1].k;
                            break;
                        }
                    }
                    if(top[0]==i2-1)		//没有相符合的一项直接加到后面
                    {
                        top[0]++;
                        a[0][top[0]]=a[i][i1];
                    }
                }
            }
        }
        else if(c[0]=='*'&&flag!=0)
        {
            for(i=1; n>i; i++)
            {
                top[4]=0;
                for(i1=0; top[i]>=i1; i1++)
                {
                    if(a[i][i1].k!=0)
                    {
                        for(i2=0; top[0]>=i2; i2++)
                        {
                            a[4][top[4]].k=a[0][i2].k*a[i][i1].k;		//用a[4]来过渡
                            a[4][top[4]].x=a[0][i2].x+a[i][i1].x;
                            a[4][top[4]].y=a[0][i2].y+a[i][i1].y;
                            top[4]++;
                        }
                    }
                }
                top[0]=0;
                for(i1=0; top[4]>i1; i1++)		//将a[4]的值转到a[0]中
                {
                    for(i2=0; top[0]>i2; i2++)
                    {
                        if(a[0][i2].x==a[4][i1].x&&a[0][i2].y==a[4][i1].y)
                        {
                            a[0][i2].k=a[4][i1].k+a[0][i2].k;
                            break;
                        }
                    }
                    if(top[0]==i2)
                    {
                        a[0][top[0]]=a[4][i1];
                        top[0]++;
                    }
                }
                top[0]--;
            }
        }
        if(c[0]=='*'&&flag==0)		//n个多项式中其中有0的式子直接输出零
        {
            printf("0");
        }
        else
        {
            top[1]=0;
            for(i=0; top[0]>=i; i++)		//处理数据,合并同指数同未知数的项,并用a[1]做输出,这就是为什么前面要初始化,节省空间就不再开一组数据
            {
                if(a[0][i].k!=0)
                {
                    for(i1=0; top[1]>i1; i1++)
                    {
                        if(a[0][i].x==a[1][i1].x&&a[0][i].y==a[1][i1].y)
                        {
                            a[1][i1].k=a[0][i].k+a[1][i1].k;
                            break;
                        }
                    }
                    if(top[1]==i1)
                    {
                        a[1][top[1]]=a[0][i];
                        if(a[1][top[1]].y==0&&a[1][top[1]].x!=0)
                        {
                            a[1][top[1]].y=2000000007;		//因为有x的一项要比有x有y的优先级高,这里就当做y的指数为最大
                        }
                        top[1]++;
                    }
                }
            }
            sort(a[1],a[1]+top[1],cmp);
            if((a[1][0].x==0&&a[1][0].y==0)||a[1][0].k!=1)		//第一项系数或者常数的输出
            {
                printf("%d",a[1][0].k);
            }
            if(a[1][0].k!=0)		//如果系数为0,未知数的输出就可以跳过
            {
                if(a[1][0].x!=0)	//输出x
                {
                    if(a[1][0].x==1)
                    {
                        printf("x");
                    }
                    else
                    {
                        printf("x^%d",a[1][0].x);
                    }
                }
                if(a[1][0].y!=2000000007&&a[1][0].y!=0)		//输出y,y=2000000007只是方便排序,实质上y的指数为0
                {
                    if(a[1][0].y==1)
                    {
                        printf("y");
                    }
                    else
                    {
                        printf("y^%d",a[1][0].y);
                    }
                }
            }
            for(i=1; top[1]>i; i++)		//第i+1项的输出
            {
                printf("+");
                if((a[1][i].x==0&&a[1][i].y==0)||a[1][i].k!=1)
                {
                    printf("%d",a[1][i].k);
                }
                if(a[1][i].k!=0)
                {
                    if(a[1][i].x!=0)
                    {
                        if(a[1][i].x==1)
                        {
                            printf("x");
                        }
                        else
                        {
                            printf("x^%d",a[1][i].x);
                        }
                    }
                    if(a[1][i].y!=2000000007&&a[1][i].y!=0)
                    {
                        if(a[1][i].y==1)
                        {
                            printf("y");
                        }
                        else
                        {
                            printf("y^%d",a[1][i].y);
                        }
                    }
                }
            }
        }
        printf("\n");
        scanf("%d",&n);
    }
    return 0;
}
 



/**************************************
	Problem id	: SDUT OJ 1482 
	Code Len	: 8079B 
	Result		: Accepted 
	Take Memory	: 544K 
	Take Time	: 0MS 
	Submit Time	: 2016-07-21 16:39:02  
**************************************/


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值