tyvj/joyoi 1043 表达式计算4

时间:2023-03-09 21:47:17
tyvj/joyoi 1043 表达式计算4

这题怎么这么毒瘤...

一开始我想转后缀表达式来计算,后来发现有负数...弃疗。

递归求解又发现会有多余括号,我觉得不行...

实在是毒瘤啊!

 #include <cstdio>
#include <iostream>
#include <string>
typedef long long LL;
std::string s; bool isop(char c) {
if(c == '+') return ;
if(c == '-') return ;
if(c == '*') return ;
if(c == '/') return ;
if(c == '^') return ;
return ;
} LL pow(LL a, LL b) {
LL ans = ;
for(int i = ; i <= b; i++) {
ans *= a;
}
return ans;
} LL solve(int l, int r) {
int f = ;
int pos1 = -, pos2 = -, pos3 = -;
for(int i = l; i <= r; i++) {
if(isop(s[i]) && (!f)) {
if(s[i] == '+' || s[i] == '-') {
pos1 = i;
}
else if(s[i] == '*' || s[i] == '/') {
pos2 = i;
}
else {
pos3 = i;
}
}
else if(s[i] == '(') f++;
else if(s[i] == ')') f--;
} if(f > ) {
LL temp = solve(l + , r);
return temp;
} if(f < ) {
LL temp = solve(l, r - );
return temp;
} if(pos1 > l) {
if(s[pos1] == '+') {
return solve(l, pos1 - ) + solve(pos1 + , r);
}
else {
return solve(l, pos1 - ) - solve(pos1 + , r);
}
}
else if(pos2 != -) {
if(s[pos2] == '*') {
return solve(l, pos2 - ) * solve(pos2 + , r);
}
else {
return solve(l, pos2 - ) / solve(pos2 + , r);
}
}
else if(pos3 != -) {
return pow(solve(l, pos3 - ), solve(pos3 + , r));
}
else if(s[l] == '(' && s[r] == ')'){
return solve(l + , r - );
}
else {
LL ans = ;
int f = ;
while(s[l] == '(') l++;
if(s[l] == '-') {
f = -;
l++;
}
for(int i = l; i <= r; i++) {
if(s[i] == ')') break;
ans = ans * + s[i] - '';
}
return ans * f;
}
} int main() {
std::cin >> s;
printf("%lld", solve(, s.size() - ));
return ;
}

AC代码