题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“++”和乘法运算符“×”,且没有括号,所有参与运算的数字均为 0 到 2^{31}之间的整数。
输入数据保证这一行只有0−9、+、×这 1212种字符。
输出格式
一个整数,表示这个表达式的值。
注意:当答案长度多于 4 位时,请只输出最后4 位,前导0不输出。
输入输出样例
输入 #1
1+1*3+4
输出 #1
8
输入 #2
1+1234567890*1
输出 #2
7891
输入 #3
1+1000000003*1
输出 #3
4
【题解】
经典问题,利用栈直接模拟即可,过程中需要取模运算即可。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<stack> 6 using namespace std; 7 const int N = 2e6+10; 8 const int mod = 10000; 9 char s[N]; 10 stack <int> num ; 11 12 int Mul(int u ,int v ){ 13 return u * v % mod ; 14 } 15 int Add(int u ,int v ){ 16 int res = u+v ; 17 if( res >= mod ) res -= mod ; 18 return res ; 19 } 20 void read(){ 21 int len = strlen(s) , i=1 ; 22 int x = s[0] - '0' ; 23 bool mul = false ; 24 while( i < len ){ 25 while( '0' <= s[i] && s[i] <= '9' ){ 26 x = x * 10 + s[i] - '0' ; 27 i ++ ; 28 } 29 if( x >= 10000 ) x%=10000; 30 num.push(x); 31 32 if( mul ){ 33 int t1 = num.top() ; 34 num.pop(); 35 int t2 = num.top() ; 36 num.pop(); 37 x = Mul(t1,t2); 38 num.push(x); 39 mul = false; 40 } 41 42 if( s[i] == '+' || s[i] =='*' ) { 43 mul = (s[i] =='*') ; 44 } 45 x = 0 ; 46 i++; 47 } 48 int ans = 0 ; 49 while( !num.empty() ){ 50 ans = Add( (int)num.top() , ans ); 51 num.pop() ; 52 } 53 printf("%d ",ans); 54 } 55 int main() 56 { 57 scanf("%s",s); 58 //printf("%s ",s); 59 read(); 60 return 0; 61 }