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 **************************************/
相关文章推荐
- Arithmetic problem | 求出 N 座大楼的外轮廓线
- webGL第三课
- 苹果自己的统计
- Divisibility(区间找数,普通方法超时)
- 七彩智能组卷软件系统 V4.9.0.0官方版
- iOS 事件响应
- 使用PHAsset获取相册中特定的图片
- 判断JAVA字符串中是否有中文字符
- 精通C++资源管理-在资源管理类中小心coping行为
- 商品规格前端显示解决方案
- Android Studio 使用的快捷键
- 猜拳游戏
- UVA 10106-Product
- android基础(四)
- jQuery hover延时触发
- adbd cannot run as root in production builds的解决方法
- Centos 安装Mongo DB
- phpems导出成绩增加自定义字段
- Android4.4 Sensor APP-->HAL代码流程
- 5-32 说反话-加强版 (20分)