F. CSP-J 完善程序 3:字符记录器(选择题版)

    客观题

CSP-J 完善程序 3:字符记录器(选择题版)

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目类型

CSP-J 初赛风格高难度完善程序题。本题所有空均为单项选择,不需要手动输入代码。每空只有一个正确选项。

输入约定

输入一个不含空格的字符串 s。字符串只包含数字、+-*/^ 和圆括号,并保证按正确选项补全程序后能够被完整处理。除数不为 0,幂的指数为非负整数,所有中间结果均在 long long 范围内。

程序没有直接说明各函数的实际作用和最终输出值的含义,请根据函数调用层次自行推断。

程序

#include <bits/stdc++.h>
using namespace std;

string s;
int pos;

long long work();

long long ipow(long long a, long long b) {
    long long r = 1;
    while (b > 0) {
        if (b & 1)
            r *= a;
        a *= a;
        b >>= 1;
    }
    return r;
}

long long take() {
    long long x = 0;
    while (pos < (int)s.size() &&
           isdigit((unsigned char)s[pos])) {
        x = /* 空 1 */;
        pos++;
    }
    return x;
}

long long part() {
    if (s[pos] == '(') {
        pos++;
        long long x = /* 空 2 */;
        pos++;
        return x;
    }

    if (s[pos] == '-') {
        pos++;
        return -part();
    }

    return take();
}

long long power() {
    long long x = part();

    if (pos < (int)s.size() && s[pos] == '^') {
        pos++;
        long long y = /* 空 3 */;
        x = ipow(x, y);
    }

    return x;
}

long long fold() {
    long long x = /* 空 4 */;

    while (pos < (int)s.size() &&
           (s[pos] == '*' || s[pos] == '/')) {
        char op = s[pos++];
        long long y = power();

        if (op == '*')
            x *= y;
        else
            x /= y;
    }

    return x;
}

long long work() {
    long long x = /* 空 5 */;

    while (pos < (int)s.size() &&
           (s[pos] == '+' || s[pos] == '-')) {
        char op = s[pos++];
        long long y = fold();

        if (op == '+')
            x += y;
        else
            x -= y;
    }

    return x;
}

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

    cin >> s;
    pos = 0;
    cout << work() << '\n';

    return 0;
}

选择区

空 1(20 分)

为了把连续数字字符按十进制组成一个多位整数,空 1 应填( )。

{{ select(1) }}

  • A. x + s[pos] - '0'
  • B. x * 10 + s[pos] - '0'
  • C. x * 10 + s[pos]
  • D. x + 10 * (s[pos] - '0')

空 2(20 分)

遇到左括号后,需要处理到与之匹配的右括号之前,并允许括号内再次出现所有运算。空 2 应填( )。

{{ select(2) }}

  • A. take()
  • B. part()
  • C. fold()
  • D. work()

空 3(20 分)

为了使 2^3^22^(3^2) 的方式处理,并完整读取右侧连续的幂运算,空 3 应填( )。

{{ select(3) }}

  • A. take()
  • B. part()
  • C. power()
  • D. fold()

空 4(20 分)

fold 函数处理乘除运算时,其每个运算对象还应能包含幂运算、括号和负号。空 4 应填( )。

{{ select(4) }}

  • A. power()
  • B. part()
  • C. work()
  • D. take()

空 5(20 分)

work 函数处理加减运算时,其每个运算对象还应能包含乘除运算。空 5 应填( )。

{{ select(5) }}

  • A. power()
  • B. fold()
  • C. part()
  • D. take()

CSPJ-8.18任务

未参加
状态
已结束
规则
乐多
题目
6
开始于
2026-8-18 0:00
结束于
2026-8-19 0:00
持续时间
24 小时
主持人
参赛人数
1