写个计算器,输入完全符合要求的(,),+,-,*,/,数字组成的表达式,计算相应结果。
思路
分先后顺序递归拆解式子。
先对+ ,- 符合进行递归,直到全是 * ,/ 表达式,再对 * ,/ 表达式进行递归直到只有数字。最后返回计算。
代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm 1006
#define ll long long int
#define INF 0x3f3f3f3f
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define mem(a) memset(a,0,sizeof(a))
#define sqr(x) (x*x)
#define inf (ll)2e18+1
#define PI acos(-1)
#define mod 10007
#define auto(i,x) for(int i=head[x];i;i=ed[i].nxt)
ll read(){
ll x=0,f=1ll;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
char s[maxn];
double f(int l,int r){
double num=0.0;
double dian=1;
bool flag=0;
while(s[l]=='(')l++;
while(s[r]==')')r--;
inc(i,l,r){
if(s[i]=='.'){
flag=1;
continue;
}
if(flag)dian*=10;
num=num*10.0+(s[i]-'0');
}
return num/dian;
}
bool isnum(int l,int r){
inc(i,l,r){
if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/')continue;
else return false;
}
return true;
}
double calc(int l,int r){
if(l>r)return 0.0;
int cnt=0;
double res=0.0;
if(isnum(l,r))return f(l,r);
int jia=-1,chen=-1;
inc(i,l,r){
if((s[i]=='+'||s[i]=='-')&&cnt==0){
jia=i;
break;
}
if(s[i]=='(')cnt++;
if(s[i]==')')cnt--;
}
if(jia>=0){
if(s[jia]=='+')return calc(l,jia-1)+calc(jia+1,r);
else return calc(l,jia-1)-calc(jia+1,r);
}
cnt=0;
inc(i,l,r){
if((s[i]=='*'||s[i]=='/')&&cnt==0){
chen=i;
break;
}
if(s[i]=='(')cnt++;
if(s[i]==')')cnt--;
}
if(chen>=0){
if(s[chen]=='*')return calc(l,chen-1)*calc(chen+1,r);
else return calc(l,chen-1)/calc(chen+1,r);
}
return calc(l+1,r-1);
}
int main()
{
while(~scanf("%s",s)){
int len=strlen(s);
printf("%f\n",calc(0,len-1));
}
return 0;
}