【NOIP复赛普及组2013】【栈】表达式求值
【问题描述】 给定一个只包含加法和乘法的算术表达式,请编程计算表达式的值。
【输入格式】 输入仅有一行,为需要计算的表达式。表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 0~2^31 -1 之间的整数。输入数据保证这一行只有0~9、+、* 这 12 种字符。
【输出格式】 输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。
【输入样例 1】
1+1*3+4
【输出样例 1】
8
【输入样例 2】
1+1234567890*1
【输出样例 2】
7891 【输入样例 3】
1+1000000003*1
【输出样例 3】
4
【输入输出样例说明】
样例 1 计算的结果为 8,直接输出 8。
样例 2 计算的结果为 1234567891,输出后 4 位,即 7891。
样例 3 计算的结果为 1000000004,输出后 4 位,即 4。
【数据范围】
对于 30% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤100。
对于 80% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000。
对于 100% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
其实题目本意非常简单,就是给个表达式,我的思路是:
1)读入一个数字读入一个符号(因为题目让我们只保留后四位,所以读入数字时,要mod 10000)
2)根据优先级,先处理乘号
3)直接累加
#include<iostream> using namespace std; unsigned long long num[100000]; char sign[100000]; unsigned long long i,l=1,ans; int main(){ cin>>num[1]; while(cin>>sign[l]){ l++; cin>>num[l]; num[l]%=10000; } l--; for(i=1;i<=l;i++) if(sign[i]=='*') {num[i+1]=num[i]*num[i+1];num[i]=0;num[i+1]%=10000;} for(i=1;i<=l+1;i++)ans+=num[i]; cout<<ans%10000; return 0; }

浙公网安备 33010602011771号