zoukankan      html  css  js  c++  java
  • 洛谷 P1981 表达式求值

    题目描述

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

    输入输出格式

    输入格式:

     

    输入文件为 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
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    std::bind 详解及参数解析
    c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
    继续进发
    lua闭包
    Mysql按时间段分组查询来统计会员的个数
    linux安装配置sendmail实现邮件发送
    Javascript验证用户输入URL地址是否正确
    php返回json数据函数例子
    ArrayList与List对象用法与区别
    java 获取数组(二维数组)长度实例程序
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7906103.html
Copyright © 2011-2022 走看看