题意
- 对给定的数学表达式,求解其值(包含括号,加减乘除,幂)
思路
- 通过递归的方式,每次找到最后一个运算的运算符,然后递归处理该运算符的左边和右边,直到当前区间只有数字,然后将两个递归的结果按照符号处理即可
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int digit(int l,int r){
int num=0;
for(int i=l;i<=r;i++){
num=num*10+s[i]-'0';
}
return num;
}
int calc(int l,int r){
int kuo=0,pos1=-1,pos2=-1,pos3=-1;
for(int i=l;i<=r;i++){
if(s[i]=='(')kuo++;
if(s[i]==')')kuo--;
if(kuo<=0){
if(s[i]=='+'||s[i]=='-')pos1=i;
if(s[i]=='*'||s[i]=='/')pos2=i;
if(s[i]=='^')pos3=i;
}
}
if(pos1==-1&&pos2==-1&&pos3==-1){
if(kuo==0&&s[l]=='(')return calc(l+1,r-1);
else if(kuo>0&&s[l]=='(')return calc(l+1,r);
else if(kuo<0&&s[r]==')')return calc(l,r-1);
else return digit(l,r);
}
if(pos1!=-1){
if(s[pos1]=='+')return calc(l,pos1-1)+calc(pos1+1,r);
else return calc(l,pos1-1)-calc(pos1+1,r);
}
else if(pos2!=-1){
if(s[pos2]=='*')return calc(l,pos2-1)*calc(pos2+1,r);
else return calc(l,pos2-1)/calc(pos2+1,r);
}
else if(pos3!=-1){
return pow(calc(l,pos3-1),calc(pos3+1,r));
}
return 0;
}
signed main(){
cin>>s;
printf("%lld",calc(0,s.size()-1));
return 0;
}
PS
- 此题写着确实费劲,应当过一段时间重温一下——2025.3.10