noip2013 表达式求值 (表达式求值加法与乘法)

P1849表达式求值
标签: NOIP普及组2013

描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

格式

输入格式

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2 ^ 31 -1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 12 种字符。

输出格式

输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。

样例1

样例输入1[复制]

1+1*3+4

样例输出1[复制]

8

样例2

样例输入2[复制]

1+1234567890*1

样例输出2[复制]

7891

样例3

样例输入3[复制]

1+1000000003*1

样例输出3[复制]

4

限制

每个测试点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;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值