注意模上10的4次方。剩余的就是标准的表达式计算。
但是好像还有较为取巧的方法。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 10000;
stack<char> ops;
stack<LL> nums;
bool is_num(char c)
{
if(c >= '0' && c <= '9') return true;
return false;
}
void cal()
{
LL b = nums.top(); nums.pop();
LL a = nums.top(); nums.pop();
char c = ops.top(); ops.pop();
LL res;
if(c == '+') res = a + b;
else if(c == '*') res = a * b;
// cout << a << c << b << endl;
nums.push(res % mod);
}
int main()
{
string s;
cin >> s; //s = s + '+';
for(int i = 0; i < s.size(); i++)
{
char c = s[i];
if(is_num(c))
{
int j = i;
LL num = 0;
while(is_num(s[j])) num = num * 10 + (s[j] - '0'), j++;
i = j - 1;
nums.push(num % mod); // cout << num << endl;
}
else
{
if(c == '+')
{
while(ops.size()) cal();
ops.push(c);
}
else if(c == '*')
{
while(ops.size() && ops.top() == '*') cal();
ops.push(c);
}
else cout << "NO" << endl;
}
}
while(ops.size()) cal();
cout << nums.top() << endl;
return 0;
}