1836. 表达式

10175102260

python一行结束战斗

print(int(eval(input())))

这样你就可以查看别的大佬怎么用c++战斗了

爱丽丝_青贝尔克

真的是怕了这种解析字符串的题目了,我选择狗带

rua

Fifnmar

偶然看到了大佬的代码,对比一下我的,这就是大佬的力量吧……我太菜了2333

#include<bits/stdc++.h>
using namespace std;
int p; string s;
int exp();
int factor() {
    int val = 0;
    if (s[p] == '(')
        p++, val = exp(), p++;
    else
        while (isdigit(s[p]))
            val = val * 10 + s[p++] - '0';
    return val;
}
int term() {
    int val = factor();
    while (s[p] == '*' || s[p] == '/')
        if (s[p] == '*')
            p++, val *= factor();
        else
            p++, val /= factor();
    return val;
}
int exp() {
    int val = term();
    while (s[p] == '+' || s[p] == '-')
        if (s[p] == '+')
            p++, val += term();
        else
            p++, val -= term();
    return val;
}
int main() {
    cin >> s; p = 0;
    cout << exp() << endl;
}
Fifnmar

做这题我错了两次,都是因为对括号的处理有问题。此外,我还考虑了一下括号前面可能有隐式的乘号的情况,不过这题好像不存在这个问题。

我的第一个版本是用了 Lambda 作子函数的。

using namespace std;
using i32 = int32_t
using u32 = uint32_t;

/*************************************************************************************************/

i32 eval_midexpr(string_view expr) {
    // this method reinterprets the input into a expression with no brackets.
    auto get_next = [ptr = expr.data(), ed = expr.data() + expr.size(), implicit_mul = false]()
        mutable {
        optional<variant<i32, char>> ret;
        if (ptr != ed) {
            if (*ptr == '(') {
                if (implicit_mul) {
                    implicit_mul = false;
                    ret = '*';
                } else {
                    implicit_mul = true;
                    auto i = ptr;
                    for (u32 cnt = 1; cnt;) {
                        if (*++i == '(') {
                            ++cnt;
                        } else if (*i == ')') {
                            --cnt;
                        }
                    }
                    ret = eval_midexpr({ ptr + 1, (size_t)(i - ptr) - 1});
                    ptr = i + 1;
                }
            } else if (*ptr == '*' || *ptr == '/') {
                implicit_mul = false;
                ret = *ptr++;
            } else {
                implicit_mul = true;
                auto const head = *ptr;
                if (head == '+' || head == '-') {
                    ++ptr;
                }
                i32 num = 0;
                while ('0' <= *ptr && *ptr <= '9') {
                    num = num * 10 + *ptr++ - '0';
                }
                ret = head == '+' ? num ? num : 1 : head == '-' ? num ? -num : -1 : num;
            }
        }
                // 也可以去掉上面内联的 flag 设置,在最后统一地写一句这个:
        // implicit_mul = ret && holds_alternative<i32>(ret.value());
        return ret;
    };
    vector<i32> buf;
    for (decltype(get_next()) i; i = get_next();) {
        if (holds_alternative<i32>(*i)) {
            buf.push_back(get<i32>(*i));
        } else { // When buf.size() == 1, adds a dummy 0 in the front.
            auto lhs = buf.back();
            auto acc = accumulate(begin(buf), prev(end(buf)), (i32)0);
            buf.resize(2);
            buf[0] = acc;
            if (get<char>(*i) == '*') {
                buf[1] = lhs * get<i32>(*get_next());
            } else {
                buf[1] = lhs / get<i32>(*get_next());
            }
        }
    }
    return accumulate(begin(buf), end(buf), (i32)0);
}

int main() {
    string expr; cin >> expr;
    cout << eval_midexpr(expr) << '\n';
}

当然也可以用普通的函数,只不过得显式地传递参数。

auto get_next(char const*& ptr, char const* const ed, bool& implicit_mul) {
    // 函数体完全一致
}

做这种题,就让我特别想看龙书,学点屠龙之技(滑稽)。

不知道这个人是谁

@echo off
set /p a=
set /a b=%a%
echo %b%
pause

真心希望以后可以#include

你当前正在回复 博客/题目
存在问题!