【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;
}

 

posted @ 2018-06-30 10:23  LizLiz  阅读(481)  评论(0)    收藏  举报