NC50999 表达式计算4

表达式计算4

https://ac.nowcoder.com/acm/problem/50999

题目:给你一个含^(乘方)与多余的括号的表达式,输出结果
思路:分治
利用递归将每个括号与符号左右拆分成一个个小式子再在计算中合并到一起
具体看代码实现(参考了较多雨巨的代码)
代码:

#include <iostream>
#include <string>
#include <math.h>
using namespace std;
string s;
int num(int l,int r)//把字符串转换成数字
{
    int ans=0;
    for(int i=l; i<=r; i++)
    {
        ans*=10;
        ans+=s[i]-'0';
    }
    return ans;
}
int solve(int l,int r)
{
    int pos1=-1,pos2=-1,pos3=-1;//pos1记录+-,pos2记录*/,pos3记录^
    int cnt=0;//记录括号
    if(l>r)return 0;
    if(l==r)return s[l]-'0';
    for(int i=l; i<=r; i++)
    {
        if(s[i]=='(')cnt++;
        if(s[i]==')')cnt--;
        if(cnt==0)//当cnt==0时说明目前没有括号了
        {
            if(s[i]=='+'||s[i]=='-')pos1=i;
            if(s[i]=='*'||s[i]=='/')pos2=i;
            if(s[i]=='^')pos3=i;
        }
    }
    if(pos1==-1&&pos2==-1&&pos3==-1)//如果一直没记录到运算符说明要不数与运算符都在括号里面,要不就是只有数字没有括号
    {
        if(cnt>0&&s[l]=='(')return solve(l+1,r);//如果是开头((多出来的直接去掉
        else if(cnt<0&&s[r]==')')return solve(l,r-1);//同理结尾多出来的直接去掉
        else if(cnt==0&&s[l]=='('&&s[r]==')')return solve(l+1,r-1);//还有(1+2+3)这种情况的也直接去掉括号
        else return num(l,r);//不然就说明全部都是数字,转化成数字
    }
    if(pos1>=0)//操作运算符了
    {
        if(s[pos1]=='+')return solve(l,pos1-1)+solve(pos1+1,r);//左右拆分
        else return solve(l,pos1-1)-solve(pos1+1,r);
    }
    else if(pos2>=0)
        if(s[pos2]=='*')return solve(l,pos2-1)*solve(pos2+1,r);
        else return solve(l,pos2-1)/solve(pos2+1,r);
    else if(pos3>=0)
        return pow(solve(l,pos3-1),solve(pos3+1,r));
    else return 0;//这里不加return 0会编译报错说没出口
}
int main()
{
    cin>>s;
    cout<<solve(0,s.size()-1);
    return 0;
}
全部评论

相关推荐

05-16 11:16
已编辑
东华理工大学 Java
牛客737698141号:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-19 14:46
和女友两个人马上毕业,现在我在鹅实习995,周六日偶尔也去北京;她在北京金融007,经常忙到后半夜,周末也没啥休息机会两个人现在都不咋聊天了,一句话隔半小时甚至半天才回。&nbsp;她是个很优秀的妹子,工作也很努力,是值得学习一辈子的人。我在努力工作求转正,即便不行至少赚到了一段不错的实习经历。已经异地了半年,接下来可能还会持续是这个状态。我们都算是对方重要的人,只是感觉看上去不是很有未来的样子。希望牛友们给点的鼓励
梦旅奇缘:很难。异地首先就已经很难了,加上妹子是金融行业,忙碌高压,对情感需求很高,而且见惯纸醉金迷,你的很多优势在她那里可能就不算什么了。这种情况下,在她们那里遇到一个能及时照顾她的人,即使那人可能很多条件不如你,你也有可能被分手。 说白了,两个卷王就不太适合在一起。因为卷王最大的优势,在另一个卷王那里就不算优势了。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务