表达式计算4(递归分治重点题型)

表达式计算4

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

注意要多写

#include <bits/stdc++.h>
using namespace std;
string s;

int zhuan(int l, int r){
    int num = 0;
    for(int i = l; i <= r; i++){
        num = num * 10 + s[i] - '0';
    }
    return num;
}

int calu(int l, int r){
    int cnt = 0;
    int pos1 = -1, pos2 = -1, pos3 = -1;
    for(int i = l; i <= r; i++){
        if(s[i] == '(') cnt++;
        if(s[i] == ')') cnt--;
        if(cnt == 0){
            if(s[i] == '+' || s[i] == '-') pos1 = i;
            if(s[i] == '*' || s[i] == '/') pos2 = i;
            if(s[i] == '^') pos3 = i;
        }
    }
//    printf("{%d %d %d}", pos1, pos2, pos3); 
    if(pos1 == -1 && pos2 == -1 && pos3 == -1){
        if(cnt == 0 && s[l] == '(') return calu(l + 1, r - 1);
        if(cnt > 0 && s[l] == '(') return calu(l + 1, r);
        if(cnt < 0 && s[r] == ')') return calu(l, r - 1);
        return zhuan(l, r);
    }
    if(pos1 != -1){
        if(s[pos1] == '+') return calu(l, pos1 - 1) + calu(pos1 + 1, r);
        else return calu(l, pos1 - 1) - calu(pos1 + 1, r);
    }
    else if(pos2 != -1){
        if(s[pos2] == '*') return calu(l, pos2 - 1) * calu(pos2 + 1, r);
        else return calu(l, pos2 - 1) / calu(pos2 + 1, r);
    }
    else{
        return pow(calu(l, pos3 - 1), calu(pos3 + 1, r));
    }
}

int main(){
    cin >> s;
    printf("%d", calu(0, s.length() - 1));
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
牛客915519934号:差不多得了 ,真以为我们好忽悠呢?当初就是听了你们的话没有赶上风口入行Java,现在还想再忽悠我呢?这明显就是一个新风口,国家大力发展制造业,以后这个圈子的钱只会越来越多,不管是入门还是大佬,只要进来少说有你一口饭吃,一个个自私自利自己上了车就劝退其他人,钱都让你赚得了呗。就这点东西,入门很容易的,学个pcb,单片机就可以去找工作了,少说一万五起,以后只会越来越高,以后想进阶就去FPGA,linux,给的钱吊打互联网,再说说你们一直说数电模电难?实际呢也不过一个月就能拿下的事情,你不需要学的多深,只需要入门就足够了,就按我说的学出来少说两万起,最好报个培训班,入门更快,兄弟们跟着我冲就完事了,趁着这个机会,狠狠赚他一笔。
点赞 评论 收藏
分享
SaltedReed:又疯了一个
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务