二元多项式
二元多項(xiàng)式
Time Limit:?1000MS?Memory Limit:?65536KB Submit?Statistic?DiscussProblem Description
給你多個(gè)二元多項(xiàng)式和一個(gè)操作符,讓你輸出操作符操作這些二元多項(xiàng)式之后的結(jié)果。
Input
首先輸入二元多項(xiàng)式的個(gè)數(shù)n和操作符號(hào)(‘+’,‘*’);
后面n行輸入每一個(gè)多項(xiàng)式。
多組輸入,當(dāng)n=0的時(shí)候結(jié)束輸入。
(n<5,二元多項(xiàng)式的長度小于1000,二元多項(xiàng)式都是由x,y,^,數(shù)字,’+’組成的)
Output
輸出操作之后的結(jié)果。
(輸出的順序按照:x^2>x>xy^2>xy>y^2>y>常數(shù))
Example Input
2 + 3x+4y^2+3xy+6x^10y^2+1 2x+6y 0Example Output
6x^10y^2+5x+3xy+4y^2+6y+1Hint
沒錯(cuò),好的代碼是需要細(xì)細(xì)品味噠qwq,小金橘的代碼
這其實(shí)是一個(gè)大模擬,期中的坑點(diǎn)也是非常多,需要很細(xì)心,考慮全面
#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);}elseret=1;}return ret; }void itout(int m,char c){if(m!=0){if(m==1)printf("%c",c);elseprintf("%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;elsesorce.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);elseans=muti(ans,temp);}ans.out();}return 0; }(⊙v⊙)
總結(jié)
- 上一篇: 什么是令牌桶(Token Bucket)
- 下一篇: import 下划线作用