2013 NOIP 普及组 第2题 表达式求值
P1981 表达式求值 (NOIP2013)
注意:
(我自己的一些错误和注意点)
if ((s[i]>=’0′) && (s[i]<=’9′)) 这句话建议加上,因为谁知道在字符串末尾可能会有一些稀奇古怪的东西
每一个 case 下面都要写上 break 来退出当前 switch 语句(我也不知道为什么,加上以后貌似就对了,之前误判了很多乘号)
还有,我自己犯了一个错误:我忘记会有连乘的情况,害得我这破题搞了一晚
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 int main() 8 { 9 freopen("expr.in","r",stdin); 10 freopen("expr.ans","w",stdout); 11 string s; 12 long long now=0,result=0,time=1,isTime=0; 13 cin >> s; 14 int len = s.length(); 15 for (int i=0;i<len;i++) 16 { 17 switch(s[i]) 18 { 19 case '+': 20 { 21 if (isTime) 22 { 23 result+=time*now; 24 result = result%10000; 25 isTime=0; 26 time=1; 27 } 28 else 29 { 30 result+=now; 31 result = result%10000; 32 } 33 now = 0; 34 break; 35 } 36 case '*': 37 { 38 time*=now; 39 time%=10000; 40 isTime = 1; 41 now=0; 42 break; 43 } 44 default: 45 { 46 if ((s[i]>='0') && (s[i]<='9')) 47 { 48 now = (now*10+s[i]-48)%10000; 49 } 50 break; 51 } 52 } 53 } 54 if (isTime) 55 { 56 result+=time*now; 57 result = result%10000; 58 } 59 else 60 { 61 result+=now; 62 result = result%10000; 63 } 64 cout << result << endl; 65 return 0; 66 }