poly

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct term{//单项式
    ll index;
    double coeff;
    term(double coeff_=0,ll index_=0):coeff(coeff_),index(index_) {}
};
istream& operator >> (istream& in,term& t){//读入单项式
    in>>t.coeff>>t.index;
    return in;
}
ostream& operator << (ostream& out,const term& t){//输出单项式(有前缀 '+' )
    out<<(t.coeff>0?'+':'-');
    if(t.index==0){//常数直接输出
        out<<fabs(t.coeff);
        return out;
    }
    if( fabs(fabs(t.coeff)-1)>=1e-6 ) out<<fabs(t.coeff);// +-1x^n 输出为 +-x^n
    out<<'x';
    if(t.index>1) out<<'^'<<t.index;//大于 1 次的才要输出次数
    return out;
}
term operator - (const term& a) { return term(-a.coeff,a.index); }//系数为相反数的单项式
term operator + (const term& a,const term& b) { return term(a.coeff+b.coeff,a.index); }//单项式的加法
term operator * (const term& a,const term& b) { return term(a.coeff*b.coeff,a.index+b.index); }//单项式的乘法
bool operator < (const term& a,const term& b) { return a.index<b.index; }//单项式次数是否更小

struct poly{//多项式
    term terms[262144];
    int count;
    poly() { count=0; }
};
inline void arrange(poly& p){//整理多项式
    sort(p.terms+1,p.terms+1+p.count);
    int cur=1;
    for(int i=2;i<=p.count;i++)//合并次数相同的项
        if(p.terms[cur].index!=p.terms[i].index) p.terms[++cur]=p.terms[i];
        else p.terms[cur]=p.terms[cur]+p.terms[i];
    p.count=cur;

    cur=0;
    for(int i=1;i<=p.count;i++)//删除系数为 0 的项
        if(fabs(p.terms[i].coeff)>1e-6) 
            p.terms[++cur]=p.terms[i];
    p.count=cur;

    if(p.count==0) p.terms[++p.count]=term(0,0);//删空了,说明为 0
}
istream& operator >> (istream& in,poly& p){//读入多项式
    in>>p.count;
    for(int i=1;i<=p.count;i++) in>>p.terms[i];
    arrange(p);
    return in;
}
ostream& operator << (ostream& out,const poly& p){//输出多项式
    if(p.terms[p.count].index==0){//只有常数项,直接输出
        out<<p.terms[1].coeff;
        return out;
    }
    
    if(p.terms[p.count].coeff<0) out<<'-';//第一项不要前缀 '+' 单独处理
    if( fabs(fabs(p.terms[p.count].coeff)-1)>=1e-6 ) out<<fabs(p.terms[p.count].coeff);
    out<<'x';
    if(p.terms[p.count].index>1) out<<'^'<<p.terms[p.count].index;
    for(int i=p.count-1;i>=1;i--) out<<p.terms[i];//输出之后每一项
    return out;
}
inline void add(poly& pa,const poly& pb){//多项式 pb 累加至多项式 pa
    for(int i=1;i<=pb.count;i++) pa.terms[pa.count+i]=pb.terms[i];
    pa.count+=pb.count;
    arrange(pa);
}
inline void dis(poly& pa,const poly& pb){//多项式 pb 累减至多项式 pa
    for(int i=1;i<=pb.count;i++) pa.terms[pa.count+i]=-pb.terms[i];
    pa.count+=pb.count;
    arrange(pa);
}
poly tmpPoly;
inline void mul(poly& pa,const poly& pb){// 多项式 pb 累乘至 pa
    tmpPoly.count=0;//先用 tmpPoly 记录
    for(int i=1;i<=pa.count;i++)
        for(int j=1;j<=pb.count;j++)
            tmpPoly.terms[++tmpPoly.count]=pa.terms[i]*pb.terms[j];
    arrange(tmpPoly);
    pa=tmpPoly;//拷贝回 pa
}

inline char getOperator(){//获取操作符
    char c=0;
    while(c!='+'&&c!='-'&&c!='*') cin>>c;
    return c;
}

int K;
poly Ans,Poly[20];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cout.precision(6);

    cin>>K;
    cin>>Ans;
    for(int i=1;i<K;i++) cin>>Poly[i];
    for(int i=1;i<K;i++){
        char c=getOperator();
        if(c=='+') add(Ans,Poly[i]);
        else if(c=='-') dis(Ans,Poly[i]);
        else if(c=='*') mul(Ans,Poly[i]);
    }
    cout<<Ans<<endl;
    return 0;
}
posted @ 2020-09-16 22:35  JustinRochester  阅读(389)  评论(0编辑  收藏  举报