您的位置:首页 > 其它

sdut 1482 二元多项式

2016-07-21 16:44 274 查看


二元多项式




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
**************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: