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^2 按 2^(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()