bnuoj 51121 Simple Polynomial Problem(栈+运算符重载+多项式运算)

来源:互联网 发布:怪物猎人帅哥捏脸数据 编辑:程序博客网 时间:2024/05/16 20:31

第一次接触多项式运算,自己写有点困难,看懂了大牛代码,然后自己写了一份;

#include <cstdio>#include <iostream>#include <cmath>#include <stack>#include <algorithm>#include <cstring>#define Mod 1000000007using namespace std;struct point{    long long a[1050];    point()    {        memset(a,0,sizeof(a));    }    point operator+(const point &p)    {        point r;        for(int i=0;i<1050;i++)            r.a[i]=(a[i]+p.a[i])%Mod;        return r;    }    point operator*(const point &p)    {        point r;        for(int i=0;i<1050;i++)        {            if(a[i]==0)                continue;            for(int j=0;j<1050;j++)            {                if(p.a[j]==0)                    continue;                r.a[i+j]+=a[i]*p.a[j];                r.a[i+j]%=Mod;            }        }        return r;    }};int main(){    int T;    scanf("%d",&T);    while(T--)    {        char su[1050],str[1050];        stack<point>cu;        stack<char>fu;        scanf("%s",str);        int len=strlen(str),cnt=0;        for(int i=0;i<len;i++)        {            if(str[i]=='(')                fu.push(str[i]);            else if(str[i]=='+'||str[i]=='*')            {                while(!fu.empty()&&fu.top()=='*'&&str[i]=='+')                {                    su[cnt++]=fu.top();                    fu.pop();                }                fu.push(str[i]);            }            else if(str[i]=='x')                su[cnt++]=str[i];            else if(isdigit(str[i]))            {                if(isdigit(str[i+1]))                    su[cnt++]=str[i];                else                {                    su[cnt++]=str[i];                    su[cnt++]='#';                }            }            else if(str[i]==')')            {                while(fu.top()!='(')                {                    su[cnt++]=fu.top();                    fu.pop();                }                fu.pop();            }        }        while(!fu.empty())        {            su[cnt++]=fu.top();            fu.pop();        }        for(int i=0;i<cnt;i++)        {            point t;            if(su[i]=='x')            {                t.a[1]=1;                cu.push(t);            }            else if(isdigit(su[i]))            {                long long n=0;                while(isdigit(su[i]))                {                    n=n*10+su[i]-'0';                    i++;                }                t.a[0]=n;                cu.push(t);            }            else if(su[i]=='+'||su[i]=='*')            {                point t1,t2;                t1=cu.top();                cu.pop();                t2=cu.top();                cu.pop();                if(su[i]=='+')                    cu.push(t1+t2);                else if(su[i]=='*')                    cu.push(t1*t2);            }        }        point r=cu.top();        int id=-1;        for(int i=1049;i>=0;i--)        {            if(r.a[i])            {                id=i;                break;            }        }        if(id!=-1)        {            for(int i=id;i>=0;i--)            {                printf("%lld",r.a[i]);                printf(i==0?"\n":" ");            }        }        else            printf("0\n");    }    return 0;}



 

0 0