洛谷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;
    /*深不神奇*/
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值