P1849表达式求值
描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
格式
输入格式
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2 ^ 31 -1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 12 种字符。
输出格式
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。
限制
每个测试点1s。
提示
样例解释:
样例 1 计算的结果为 8,直接输出 8。
样例 2 计算的结果为 1234567891,输出后 4 位,即 7891。
样例 3 计算的结果为 1000000004,输出后 4 位,即 4。
对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
来源
NOIP 2013 普及组
#include<cstdio>
#include<cstring>
#include<cctype>
#define mod 10000
using namespace std;
int s[10],n[10];
void work()
{
int i=s[0],j=n[0];
if(s[i]==1)n[j-1]=(n[j-1]+n[j])%mod;
else n[j-1]=(n[j-1]*n[j])%mod;
s[0]--,n[0]--;
}
int main()
{
//freopen("1.in","r",stdin);
char tmp; int i,j=0,k=0;
while(scanf("%c",&tmp)!=EOF)
if(!isdigit(tmp))
{
n[++n[0]]=k%mod;
k=i=j=0;
if(tmp=='+')i=1;
if(tmp=='*')i=2;
if(i==0)break;
while(s[0]>0 && s[s[0]]>=i)work();
s[++s[0]]=i;
}
else j=1,k=k*10+tmp-'0';
if(j==1)n[++n[0]]=k%mod;
while(s[0]>0)work();
printf("%d\n",n[1]);
return 0;
}