说明
题解里的dalao那么多%%%,我的代码又奇丑无比,所以放在博客里.
M_sea太强啦%%%%%%
做法
此方法可以解决带括号,只含有四则运算(加减乘除)的任何中缀表达式. 要处理实数自己改,,,
首先读入字符串,然后从后往前找运算符号,如果找到+ - x / 就记录位置(注意:要找括号外面的+ - x /),然后以符号为界将字符串分成两部分,按照此法则处理(就是分治),没遇到符号就返回数字值,否则将符号两边得到的数字值进行运算,返回这个值.
具体实现在代码中 格式巨丑,dalao轻喷
代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
#include<math.h>
#include<cstdlib>
using namespace std;
char a[1000000];
int findx(int l,int r) //找+-x/符号下表
{
int xx=0,yy=0,z=0;
bool dd=true; //xx表示找到的+ - 号的下标,yy表示找到的x /号下标,z表示目前处在的括号层数(z==0说明不在括号内)
for(int i=r;i>=l;i--) //为什么从后往前呢?因为-和/(从前往后就GG)
{
if((a[i]=='+'||a[i]=='-')&&!z)
{
xx=i; //找到+ -后立刻返回下标
break; //这是因为x /号运算级高
}
else if((a[i]=='*'||a[i]=='/')&&dd&&!z)
{
dd=!dd; //找到x /后记录下标,找+ -
yy=i;
}
else if(a[i]==')') z++; //遇到括号
else if(a[i]=='(') z--;
}
if(xx!=0) return xx;
if(yy!=0) return yy;
return -1;
}
int jj(int l,int r)
{
if(a[l]=='('&&a[r]==')') //去括号
return jj(l+1,r-1);
int pq=findx(l,r); //找符号
if(pq<l||pq>r||l==r)
{
int xx=0;
for(int i=l;i<=r;i++)
{
xx=(xx*10)%10000;
xx+=a[i]-48;
}
return xx; //无符号记录数字
}
int s1=jj(l,pq-1);
int s2=jj(pq+1,r); //记录符号两边的数字
if(a[pq]=='+') return (s1+s2-1)%10000+1;
if(a[pq]=='-') return (s1-s2-1)%10000+1;
if(a[pq]=='*') return (s1*s2-1)%10000+1;
return (s1/s2-1)%10000+1; //运算求值
}
int main()
{
gets(a);
printf("%d\n",jj(0,strlen(a)-1)%10000);
return 0;
/*深不神奇*/
}