记录编号 346208 评测结果 AAAAAAAAAA
题目名称 有括号的算术表达式运算 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 0.021 s
提交时间 2016-11-11 22:59:17 内存使用 0.25 MiB
显示代码纯文本
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <string>
#include <list>
#include <vector>
#include <queue>
#include <iostream>
#include <functional>
using namespace std;
int get_wei(char op)
{
    switch(op)
    {
        case '+':
        case '-':
            return 3;
        case '*':
        case '/':
            return 2;
        case '^':
            return 1;
        default:
            return -1;
    }
}
int fast_pow(int base, int exp)
{
    int ans = 1;
    while(exp)
    {
        if(exp & 1)ans *= base;
        exp >>= 1;
        base *= base;
    }
    return ans; 
}
int calc(const char *s, int len)
{
    int pos = 0, wei = 0, nwei;
    int bk = 0;
    for(int i = 0; i < len; i++)
    {
        if(s[i] == '(')bk++;
        else if(s[i] == ')')bk--;
        if(bk)continue;
        nwei = get_wei(s[i]);
        if(nwei >= wei)
        {
            wei = nwei;
            pos = i;
        }
    }
    if(wei > 0)
    {
        int lval = calc(s, pos);
        int rval = calc(s+pos+1, len-pos-1);
        switch(s[pos])
        {
            case '+':
                return lval + rval;
            case '-':
                return lval - rval;
            case '*':
                return lval * rval;
            case '/':
                return lval / rval;
            case '^':
                return fast_pow(lval, rval);
        }
    }
    if(s[0] =='(')
        return calc(s+1, len-2);
    return atoi(s);
}
int main()
{
    freopen("ssexpress.in", "r", stdin);
    freopen("ssexpress.out", "w", stdout);
    string s;
    cin >> s;
    cout << calc(s.c_str(), s.length()-1);
    return 0;
}