[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