按 '+' 拆分加法项,每项内按 '*' 累积乘积,扫描中每步对 10000 取模,即得答案的后 4 位。
OJ: roj
题目 ID: 3605
难度:普及-
标签:模拟数学python
创建: 2026-10-02 10:17
更新: 2026-10-06 15:08
题目描述
给定一个只含数字、+、* 的表达式,计算其值;结果超过 4 位时只输出后 4 位(去掉前导零)。
输入一行表达式;输出一个整数。
样例:1+1*3+4 → 8,1+1234567890*1 → 7891,1+1000000003*1 → 4;运算符总数 ≤ 100000。
思路
扫描表达式,维护当前数字、当前乘法项的积与已累加答案,遇到 + 结算乘法项、* 把当前数字乘进项,每步对 10000 取模。
参考代码
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-10-02 10:18
# update_at: 2026-10-02 10:18
import sys
MOD = 10000 # 题目要求只输出答案的最后 4 位,全程取模即可
def term_value(factors: str) -> int:
"""一个乘法项的值 mod 10000:逐个因子相乘并随手取模,避免大整数膨胀。"""
value = 1
for x in factors.split('*'):
value = value * int(x) % MOD
return value
def solve() -> None:
expr = sys.stdin.buffer.read().decode().strip()
# 无括号且乘法优先:整个表达式 = 若干乘法项之和,按 '+' 拆项、按 '*' 拆因子
print(sum(term_value(group) for group in expr.split('+')) % MOD)
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-06 15:07
* update_at: 2026-10-06 15:07
*/
#include <cstdio>
using namespace std;
typedef long long ll;
const ll MOD = 10000;
char expr[1200005]; // 输入的表达式
int main() {
scanf("%s", expr);
ll ans = 0; // 已结算的加法项之和
ll prod = 1; // 当前乘法项的累积积
ll cur = 0; // 当前正在读的数字
for (ll i = 0; expr[i]; ++i) {
char ch = expr[i];
if (ch == '+') {
// 当前乘法项结束,把它累进答案,并开始新的加法项
ans = (ans + prod * cur) % MOD;
prod = 1;
cur = 0;
} else if (ch == '*') {
// 当前因子结束,把它乘进乘法项
prod = prod * cur % MOD;
cur = 0;
} else {
cur = cur * 10 + ch - '0';
}
}
ans = (ans + prod * cur) % MOD;
printf("%lld\n", ans);
return 0;
}