码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1981 表达式求值

时间:2017-11-27 23:25:18      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:pen   target   splay   class   orange   display   eve   参与   std   

题目描述

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

输入输出格式

输入格式:

 

输入文件为 expr.in。

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘

法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保

证这一行只有 0~ 9、+、*这 12 种字符。

 

输出格式:

 

输出文件名为 expr.out。

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

请只输出最后 4 位,前导 0 不输出。

 

输入输出样例

输入样例#1: 复制
1+1*3+4
输出样例#1: 复制
8
输入样例#2: 复制
1+1234567890*1
输出样例#2: 复制
7891
输入样例#3: 复制
1+1000000003*1
输出样例#3: 复制
4

说明

对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;

对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;

对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

技术分享图片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10000
#define MAXN 1000010
using namespace std;
int tmp[MAXN];
int top1,top2,len;
char s[MAXN],bns[MAXN];
long long stack1[MAXN];
void work(){
    int m1=stack1[top1],n1=stack1[top1-1];
    top1--;
    if(bns[top2]==+)
        stack1[top1]=(n1%mod+m1%mod)%mod;
    else if(bns[top2]==*)
        stack1[top1]=(n1%mod*m1%mod)%mod;
    top2--;
}
int main(){
    tmp[43]=2;tmp[42]=1;
    scanf("%s",s);
    len=strlen(s);
    long long num=0;
    for(int i=0;i<len;i++){
        if(s[i]>=0&&s[i]<=9)    num=num*10+s[i]-0;
        else{
            if(num!=0){
                stack1[++top1]=num;
                num=0;
            }
            if(tmp[s[i]]<tmp[bns[top2]])    bns[++top2]=s[i];
            else{
                while(tmp[s[i]]>=tmp[bns[top2]]&&top2>0)    work();
                bns[++top2]=s[i];
            }
        }
    }
    if(num!=0){    stack1[++top1]=num;num=0; }
    while(top2>0)    work();
    cout<<stack1[1]%mod;
}
80gg
技术分享图片
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    long long shu,sum=0,cj,sg;//记得sum初始值赋为0;cj为其中一段运算(即一段连续的乘积)的值
    char ch=0,xg;//ch存储上一个运算符,xg为新读入的运算符
    bool tf=true;
    while(tf)
    {
        scanf("%lld",&shu);
        tf=scanf("%c",&xg)==1?true:false;//如果下一个没有运算符了,则tf=false,既保证了此次循环的正常运行,又能在下一遍循环跳出
        if(ch==0)cj=shu;//如果是刚开始读入,则直接赋值
        if(ch==+)sum=(sum+cj)%10000,cj=shu;//如果上一个操作是加法,则将前一段的值加入到sum中,然后再更新此新段的值
        if(ch==*)cj=(cj*shu)%10000;//如果上一个运算仍是乘法,则将此数乘入本段的值中
        if(!tf)sum=(sum+cj)%10000;//如果是最后一个元素,则进行最后的更新
        ch=xg;//将下一个读入的运算符作为新的一个循环的上一个运算符,并继续循环
    }
    printf("%lld",sum);//输出
    return 0;
}
std

 

洛谷 P1981 表达式求值

标签:pen   target   splay   class   orange   display   eve   参与   std   

原文地址:http://www.cnblogs.com/cangT-Tlan/p/7906103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!