二元多项式
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
给你多个二元多项式和一个操作符,让你输出操作符操作这些二元多项式之后的结果。
Input
首先输入二元多项式的个数n和操作符号(‘+’,‘*’);
后面n行输入每一个多项式。
多组输入,当n=0的时候结束输入。
(n<5,二元多项式的长度小于1000,二元多项式都是由x,y,^,数字,’+’组成的)
Output
输出操作之后的结果。
(输出的顺序按照:x^2>x>xy^2>xy>y^2>y>常数)
Example Input
2 + 3x+4y^2+3xy+6x^10y^2+1 2x+6y 0
Example Output
6x^10y^2+5x+3xy+4y^2+6y+1
Hint
没错,好的代码是需要细细品味哒qwq,小金橘的代码
这其实是一个大模拟,期中的坑点也是非常多,需要很细心,考虑全面
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
using namespace std;
const int maxn=5000;
char arr[maxn];
int getnum(int &i){
int val=0;
while(isdigit(arr[i])){
val*=10;
val+=arr[i]-'0';
i++;
}
return val;
}
int getclo(int &str,char c){
int ret=0;
if(arr[str]==c){
str++;
if(arr[str]=='^'){
str++;
ret=getnum(str);
}
else
ret=1;
}
return ret;
}
void itout(int m,char c){
if(m!=0){
if(m==1)
printf("%c",c);
else
printf("%c^%d",c,m);
}
}
struct item{
int x,y;
int v;
item(int _v=0,int _x=0,int _y=0){
v=_v,x=_x,y=_y;
}
void init(int &str){
v=getnum(str);
x=getclo(str,'x');
y=getclo(str,'y');
if(v==0 && (x!=0||y!=0)) v=1;
}
void out(){
printf(v==1 && (x||y)?"":"%d",v);
itout(x,'x');
itout(y,'y');
}
bool operator < (const item &k) const{
if(x!=k.x)
return x>k.x;
if(abs(x-y)!=abs(k.x-k.y))
return abs(x-y)>abs(k.x-k.y);
return y<k.y;
}
bool operator == (const item &k) const{
return x==k.x && y==k.y;
}
item operator * (item c){
c.v*=v;
c.x+=x;
c.y+=y;
return c.v!=0?c:item(0,0,0);
}
};
struct poly{
vector<item> sorce;
void init(int &str){
sorce.clear();
item temp;
while(arr[str]){
if(str!=0)
str++;
temp.init(str);
sorce.push_back(temp);
}
sort(sorce.begin(),sorce.end());
}
void out(){
for(int i=0;i<sorce.size();i++){
sorce[i].out();
printf(i<sorce.size()-1?"+":"\n");
}
}
void uni(){
sort(sorce.begin(),sorce.end());
vector<item> tem=sorce;
sorce.clear();
for(int i=0;i<tem.size();i++){
item &ed=sorce[sorce.size()-1];
if(tem[i]==ed)
ed.v+=tem[i].v;
else
sorce.push_back(tem[i]);
}
}
};
poly add(poly a,poly b){
poly ans=a;
for(int i=0;i<b.sorce.size();i++)
ans.sorce.push_back(b.sorce[i]);
ans.uni();
return ans;
}
poly muti(poly a,poly b){
poly c;
for(int i=0;i<a.sorce.size();i++)
for(int j=0;j<b.sorce.size();j++)
c.sorce.push_back(a.sorce[i]*b.sorce[j]);
c.uni();
return c;
}
int main(){
int n;
while(~scanf("%d",&n) && n){
scanf("%s\n",arr);
char c=arr[0];
int t=0;
scanf("%s",arr);
poly ans;
ans.init(t);
poly temp;
for(int i=1;i<n;i++){
scanf("%s",arr);
t=0;
temp.init(t);
if(c=='+')
ans=add(ans,temp);
else
ans=muti(ans,temp);
}
ans.out();
}
return 0;
}
(⊙v⊙)