洛谷1981 表达式求值


题目创送门


说明

题解里的dalao那么多%%%,我的代码又奇丑无比,所以放在博客里.

M_sea太强啦%%%%%%

做法

此方法可以解决带括号,只含有四则运算(加减乘除)的任何中缀表达式. 要处理实数自己改,,,
首先读入字符串,然后从后往前找运算符号,如果找到+ - x / 就记录位置(注意:要找括号外面的+ - x /),然后以符号为界将字符串分成两部分,按照此法则处理(就是分治),没遇到符号就返回数字值,否则将符号两边得到的数字值进行运算,返回这个值.
具体实现在代码中 格式巨丑,dalao轻喷


代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
#include<math.h>
#include<cstdlib>
using namespace std;
char a[1000000];
int findx(int l,int r)  //找+-x/符号下表
{
    int xx=0,yy=0,z=0;
    bool dd=true;   //xx表示找到的+ - 号的下标,yy表示找到的x /号下标,z表示目前处在的括号层数(z==0说明不在括号内) 
    for(int i=r;i>=l;i--)   //为什么从后往前呢?因为-和/(从前往后就GG)
    {
        if((a[i]=='+'||a[i]=='-')&&!z)
        {
            xx=i;   //找到+ -后立刻返回下标
            break;  //这是因为x /号运算级高
        }
        else if((a[i]=='*'||a[i]=='/')&&dd&&!z)
        {
            dd=!dd; //找到x /后记录下标,找+ -
            yy=i;
        }
        else if(a[i]==')') z++; //遇到括号
        else if(a[i]=='(') z--;
    }
    if(xx!=0) return xx;
    if(yy!=0) return yy;
    return -1;
}
int jj(int l,int r)
{
    if(a[l]=='('&&a[r]==')')    //去括号
       return jj(l+1,r-1);
    int pq=findx(l,r);  //找符号
    if(pq<l||pq>r||l==r)
    {
        int xx=0;
        for(int i=l;i<=r;i++)
        {
            xx=(xx*10)%10000;
            xx+=a[i]-48;
        }
        return xx;  //无符号记录数字
    }
    int s1=jj(l,pq-1);
    int s2=jj(pq+1,r);  //记录符号两边的数字
    if(a[pq]=='+') return (s1+s2-1)%10000+1;
    if(a[pq]=='-') return (s1-s2-1)%10000+1;
    if(a[pq]=='*') return (s1*s2-1)%10000+1;
    return (s1/s2-1)%10000+1;   //运算求值
}
int main()
{
    gets(a);
    printf("%d\n",jj(0,strlen(a)-1)%10000);
    return 0;
    /*深不神奇*/
}

GP11306 安欣买酸奶 普及- 字符串 NOIp 普及组 模拟 2013 栈 表达式求值 标准IO 传统题 时间限制 1000ms 内存限制 256MB 通过/尝试次数 41/55 来源 题目背景 猫叉老师刚才吃完 n n碗曹氏热卤之后,发现自己还是有些小瞧了曹氏的辣度,她的胃开始隐隐作痛,于是委托安欣老师去超市帮她买酸奶,而且要买很多很多的酸奶!!(众所周知酸奶是解辣神器) 由于超市店员忘了给安欣老师小票,于是安欣老师为了更好的找猫叉老师报销酸奶钱,就把买酸奶花的钱写成了一个算数表达式。(安欣其实也想请猫叉老师喝,但是毕竟破产了,还是把酸奶钱要一下吧) 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。 输入格式 一行,为需要你计算的表达式表达式中只包含数字、加法运算符 + 和乘法运算符 *,且没有括号,所有参与运算的数字均为 0 0 到 2 31 − 1 2 31 −1 之间的整数。 输入数据保证这一行只有 0123456789+* 这 12 12 种字符。 输出格式 一个整数,表示这个表达式的值。 注意:当答案长度多于 4 4 位时,请只输出最后 4 4 位,前导 0 0 不输出。 input1 复制代码 1+1*3+4 output1 复制代码 8 input2 复制代码 1+1234567890*1 output2 复制代码 7891 input3 复制代码 1+1000000003*1 output3 复制代码 4 提示 对于 30 % 30% 的数据, 0 ≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100 ≤100。 对于 80 % 80% 的数据, 0 ≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 1000 ≤1000。 对于 100 % 100% 的数据, 0 ≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100000 ≤100000 双端队列 c++daima
最新发布
05-09
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值