1. 程式人生 > 其它 >[NOIP2013 普及組] 表示式求值

[NOIP2013 普及組] 表示式求值

[NOIP2013 普及組] 表示式求值 給定一個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。

 Input

一行,為需要你計算的表示式,表示式中只包含數字、加法運算子“+”和乘法運算子“*”,且沒有括號,所有參與運算的數字均為 int 範圍內的正整數。

輸入資料保證這一行只有0~9、+、*這12種字元。

 Output

一個整數,表示這個表示式的值。

 

直接上程式碼

 1 #include<iostream>
 2 long long a[1000001],ha=1,sum=0;
 3 char s[1000001];
 4 using namespace std;
 5 int
main() 6 { 7 cin>>a[ha]; 8 a[ha]%=10000; 9 while(cin>>s[ha]>>a[++ha]) 10 { 11 a[ha]%=10000; 12 } 13 for(int i=ha;i>=1;i--) 14 { 15 if(s[i]=='*') 16 { 17 a[i]*=a[i+1]; 18 a[i]%=10000; 19 a[i+1]=0; 20 }
21 } 22 for(int i=1;i<=ha;i++) 23 { 24 sum+=a[i]; 25 sum%=10000; 26 } 27 cout<<sum; 28 return 0; 29 }

啥意思呢,就是說他肯定是一個數接著一個字元再接著一個數,所以我們可以用:

cin>>a[ha]; while(cin>>s[ha]>>a[++ha]

那我們就不必把連續的幾個數字字元組成一個數字這個噁心的東西了,之後我們把所有是乘數的壓入棧中,兩個兩個的乘起來再相加,但是有一點需要注意一下就是其實並不是兩兩相乘,而是把我們得到的乘數兩兩分組,所以如果是兩兩相乘的話就會有很多值被新加了起來,所以對於兩個數a[i]和a[i+1],相乘以後要讓a[i+1]=0,這樣下一次a[i+2]與a[i+1]如果相乘的話結果就是0,把它加進來也沒啥影響。

2022/3/17