简单算术表达式求值

GitHub跳转原题关系图返回列表

整行恰好一个运算符,逐字符扫描定位后切成三段,按运算符做对应整数运算。

OJ: roj

题目 ID: 1397

难度:入门

标签:模拟字符串

创建: 2026-09-30 08:34

更新: 2026-10-05 12:44

题目描述

输入一行算术表达式,格式为「运算数 运算符 运算数」,运算符是 + - * / % 之一,前后可能有空格,/ 为整数整除。输出运算的整数结果。

样例输入:32+64,样例输出:96。

思路

整行只有一个运算符,逐字符扫描定位它,把字符串切成左运算数、运算符、右运算数三段,再按运算符做对应运算即可。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-30 08:35
# update_at: 2026-09-30 08:35

import re
import sys
from operator import add, sub, mul, floordiv, mod

# 运算符 → 整数域实现:除法用 floordiv,保证 32+64 等价 C++ 的 /
OPS = {'+': add, '-': sub, '*': mul, '/': floordiv, '%': mod}


def solve() -> None:
    # 运算符前后可能有空格(如 `32 + 64`),空白分词会把运算符粘进运算数,
    # 所以按行读入、保留行内空格,再整行交给正则切分。
    data = iter(sys.stdin.buffer.read().splitlines())
    line = next(data).decode()  # 只丢行末换行
    a, op, b = re.split(r'\s*([+\-*/%])\s*', line.strip())  # 捕获组留住运算符
    print(OPS[op](int(a), int(b)))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 12:44
 * update_at: 2026-10-05 12:44
 */

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

typedef long long ll;

char s[105]; // 输入行

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // 读入整行,保留空格以便定位运算符
    cin.getline(s, sizeof(s));

    ll a = 0, b = 0;
    char op = 0;
    int i = 0;
    int n = strlen(s);

    // 跳过前导空格,解析左运算数
    while (i < n && s[i] == ' ') i++;
    while (i < n && isdigit(s[i])) {
        a = a * 10 + (s[i] - '0');
        i++;
    }

    // 跳过运算符前的空格,取运算符
    while (i < n && s[i] == ' ') i++;
    op = s[i];
    i++;

    // 跳过运算符后的空格,解析右运算数
    while (i < n && s[i] == ' ') i++;
    while (i < n && isdigit(s[i])) {
        b = b * 10 + (s[i] - '0');
        i++;
    }

    ll ans = 0;
    if (op == '+') ans = a + b;
    else if (op == '-') ans = a - b;
    else if (op == '*') ans = a * b;
    else if (op == '/') ans = a / b;
    else if (op == '%') ans = a % b;

    cout << ans << '\n';
    return 0;
}