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

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

#include <cstdio>
#include <iostream>
#include <cmath>
#include <stack>
#include <algorithm>
#include <cstring>
#define Mod 1000000007
using 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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值