P1981 [NOIP 2013 普及组] 表达式求值
题目背景
NOIP2013 普及组 T2
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 +
和乘法运算符 *
,且没有括号,所有参与运算的数字均为 000 到 231−12^{31}-1231−1 之间的整数。
输入数据保证这一行只有 0123456789+*
这 121212 种字符。
输出格式
一个整数,表示这个表达式的值。
注意:当答案长度多于 444 位时,请只输出最后 $ 4$ 位,前导 $ 0$ 不输出。
输入输出样例 #1
输入 #1
1+1*3+4
输出 #1
8
输入输出样例 #2
输入 #2
1+1234567890*1
输出 #2
7891
输入输出样例 #3
输入 #3
1+1000000003*1
输出 #3
4
说明/提示
对于 30%30\%30% 的数据,0≤0≤0≤ 表达式中加法运算符和乘法运算符的总数 ≤100≤100≤100。
对于 80%80\%80% 的数据,0≤0≤0≤ 表达式中加法运算符和乘法运算符的总数 ≤1000≤1000≤1000。
对于 100%100\%100% 的数据,0≤0≤0≤ 表达式中加法运算符和乘法运算符的总数 ≤100000≤100000≤100000。
题解
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+2;
stack<long long> s;
long long n, sum = 0;
char x;
int main(){
cin>>n;
s.push(n);
while(cin>>x>>n){
if(x == '+') {
s.push(n);
}else{
int m = s.top();
s.pop();
s.push(m*n%10000);
}
}
while(!s.empty()){
sum += s.top();
s.pop();
}
cout<<sum%10000<<endl;
return 0;
}