正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2026 第一轮真题 › 第 35 题
CSP-J 2026 第一轮 第 35 题:进制减半:②处应填
题目
给定 $n, m$,再给定一个 $mn$ 进制下的数 $A$,其各个数位上的数按照从高位到低位的顺序给出,请你将其转化为 $n$ 进制,并同样按照从高位到低位的顺序输出。
输入的第一行依次为 $n, m$ 和 $A$ 的位数 $d$,接下来 $d$ 个数 $a_{d}, a_{d - 1}, … , a_{1}$ 从高位到低位描述各个数位上的数。
数据满足 $2 \le n, m \le 10$,$1 \le d \le 18$,$0 \le A < 2^{63}$;对于所有 $1 \le i \le d$,$0 \le a_{i}< mn$。
以下程序按“逐位除以 $n$”的方法完成进制转换。请补全程序。
#include <iostream>
constexpr int N = 100005;
long long b[N];
int main() {
long long n, m, d;
std::cin >> n >> m >> d;
int len = 1;
for (int i = 0; i < d; i++) {
long long x;
std::cin >> x;
for (int j = len; j >= 1; j--)
b[j] = /* ① */;
b[0] = /* ② */;
len++;
for (int j = 0; j < len; j++)
if (b[j] >= n) {
b[j + 1] += /* ③ */;
b[j] = /* ④ */;
if (j + 1 == len) len++;
}
}
while (/* ⑤ */) len--;
for (int i = len - 1; i >= 0; i--)
std::cout << b[i] << ' ';
return 0;
}本小题
②处应填( )。
选项
- A. x * n
- B. x
- C. 0
- D. m
答案
B
题解
答案是 B. x。
数组 b 按照低位到高位存储当前数的 \(n\) 进制表示,b[0] 是最低位。
每读入一个新数位 x,当前数值应更新为: \[ 新值=旧值\times(mn)+x。 \]
前面的循环通过 b[j] = b[j - 1] * m,将各位向高位移动一位(乘以 \(n\)),再乘以 \(m\),完成乘以 \(mn\)。此时最低位空出,因此应填入新读入的 x:
``cpp b[0] = x; ``
即使 x >= n 也没关系,后面的循环会处理进位。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号