#1#2WA 求调
查看原帖
#1#2WA 求调
838570
Double_Sheep楼主2024/11/8 19:28

rt,拜谢

#include <bits/stdc++.h>
using namespace std;
const int N = 35;
typedef long long ll;
int n;
char s[N];
ll qpow(ll a, ll q) {
	ll ans = 1;
	for (; q; q >>= 1) {
		if (q & 1) ans = ans * a;
		a = a * a;
	}
	return ans;
}
ll solve(int l, int r) {
	if (l > r) return 0;
	int cnt = 0;
	for (int i = r; i >= l; i--) {
		if (s[i] == '(') cnt++;
		else if (s[i] == ')') cnt--;
		else if (cnt == 0 && (s[i] == '+' || s[i] == '-')) {
			ll x = solve(l, i - 1), y = solve(i + 1, r);
			return (s[i] == '+' ? x + y : x - y);
		}
	}
	cnt = 0;
	for (int i = r; i >= l; i--) {
		if (s[i] == '(') cnt++;
		else if (s[i] == ')') cnt--;
		else if (cnt == 0 && (s[i] == '*' || s[i] == '/')) {
			ll x = solve(l, i - 1), y = solve(i + 1, r);
			return (s[i] == '*' ? x * y : x / y);
		}
	}
	cnt = 0;
	for (int i = r; i >= l; i--) {
		if (s[i] == '(') cnt++;
		else if (s[i] == ')') cnt--;
		else if (cnt == 0 && s[i] == '^')
			return qpow(solve(l, i - 1), solve(i + 1, r));
	}
	if (s[l] == '(' && s[r] == ')') return solve(l + 1, r - 1);
	ll num = 0;
	for (int i = l; i <= r; i++) num = num * 10 + s[i] - '0';
	return num;
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> (s + 1), n = strlen(s + 1);
	cout << solve(1, n) << '\n';
	return 0;
}
2024/11/8 19:28
加载中...