整行恰好一个运算符,逐字符扫描定位后切成三段,按运算符做对应整数运算。
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;
}