链接:https://www.nowcoder.com/acm/contest/160/C
来源:牛客网
多项式
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
求,其中f和g是关于x的多项式。
输入描述:
两行,第一行为f,第二行为g。 f和g都用一个由小括号 '(' 和 ')' 、加号 '+' 、乘号 '*' 、 'x' 组成的表达式表示,表达式的语法与通常的习惯相同。 保证表达式的长度不超过1000。
输出描述:
若答案为整数x,输出x/1,答案为+,输出1/0,否则输出表示答案的最简分数a/b。
示例1
输入
复制
x+x x+(x+x)
输出
复制
2/3
示例2
输入
复制
x*(x+x+x*x+x*x) x+(x+x)*(x+x+x)
输出
复制
1/0
示例3
输入
复制
x x*(x*(x)+x)*(((x+x)))*x
输出
复制
0/1
非ac代码
#pragma GCC optimize (3)
# include <iostream>
# include <algorithm>
# include <cstring>
# include <cstdio>
# include <stack>
# define ll long long
//# define P pair<ll,ll>
using namespace std;
int Rank[256]={0};
struct P
{
ll k,p;
P(){};
P(ll m,ll n):k(m),p(n){};
};
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
void init()
{
Rank['#']=0;
Rank['(']=0;
Rank[')']=0;
Rank['+']=1;
Rank['-']=1;
Rank['*']=2;
Rank['/']=2;
return ;
}
string getRPN(string s)
{
stack <char> s1;
stack <char> s2;
s1.push('#');
for(int i=0;i<s.size();i++)
{
switch(s[i])
{
case 'x':
s2.push('x');
break;
case '(':
s1.push('(');
break;
case '+':
case '-':
case '*':
case '/':
while(Rank[s[i]]<=Rank[s1.top()])
{
s2.push(s1.top());
s1.pop();
}
s1.push(s[i]);
break;
case ')':
while(s1.top()!='(')
{
s2.push(s1.top());
s1.pop();
}
s1.pop();
break;
}
}
while(s1.top()!='#')
{
s2.push(s1.top());
s1.pop();
}
string t="";
while(s2.size())
{
t+=s2.top();
s2.pop();
}
reverse(t.begin(),t.end());
return t;
}
P calcRPN(string t)
{
stack <P > s;
P a,b;
for(int i=0;i<t.size();i++)
{
switch(t[i])
{
case 'x':
s.push(P(1,1));
break;
case '+':
if(s.size())
a=s.top();
else
break;
s.pop();
if(s.size())
b=s.top();
else
break;
s.pop();
if(a.p==b.p)
a.k=a.k+b.k;
else if(a.p<b.p)
a=b;
s.push(a);
break;
case '*':
if(s.size())
a=s.top();
else
break;
s.pop();
if(s.size())
b=s.top();
else
break;
s.pop();
a.k*=b.k;
a.p+=b.p;
s.push(a);
break;
}
}
return s.top();
}
char S[1010],T[1010];
string s,t;
int main()
{
init();
scanf("%s%s",S,T);
s=S,t=T;
s=getRPN(s);
t=getRPN(t);
P a,b;
a=calcRPN(s);
b=calcRPN(t);
if(a.p==b.p)
{
ll k=gcd(a.k,b.k);
cout<<a.k/k<<"/"<<b.k/k<<endl;
}
else if(a.p>b.p)
cout<<"1/0"<<endl;
else
cout<<"0/1"<<endl;
}