[NOIP2013-普及]表达式求值

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

按 '+' 拆分加法项,每项内按 '*' 累积乘积,扫描中每步对 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;
}