#FR2008. CSP 2026 入门级第一轮

CSP 2026 入门级第一轮

CSP 2026 入门级第一轮

第 1 题(2 分)

下列 C++ 数据类型中,能够精确存储 1018+110^{18} + 1 这个整数的是( )

{{ select(1) }}

  • float
  • long long
  • double
  • int

第 2 题(2 分)

十六进制数 2F5\text{2F5} 转换为八进制数是( )

{{ select(2) }}

  • 13641364
  • 16351635
  • 14051405
  • 13651365

第 3 题(2 分)

执行下列 C++ 代码,输出是( )

01 int a = 7, b = 3;
02 std::cout << a / b * b + a % b;

{{ select(3) }}

  • 99
  • 1010
  • 77
  • 66

第 4 题(2 分)

初始时栈为空,将 11、22、33、44 依次入栈,入栈过程中允许随时出栈。下列出栈序列中不可能出现的是( )

{{ select(4) }}

  • 2,4,3,12, 4, 3, 1
  • 1,2,3,41, 2, 3, 4
  • 3,1,2,43, 1, 2, 4
  • 1,4,3,21, 4, 3, 2

第 5 题(2 分)

一棵有 100100 个结点的完全二叉树,其中叶子结点个数是( )

{{ select(5) }}

  • 4949
  • 5050
  • 6464
  • 5151

第 6 题(2 分)

执行下列代码后 s 的值是( )

01 int s = 0;
02 for (int i = 1; i <= 100; i++)
03   if (i % 3 == 0 || i % 5 == 0)
04     s += i;

{{ select(6) }}

  • 30483048
  • 27332733
  • 23182318
  • 24182418

第 7 题(2 分)

上楼梯每步可上 11 级、22 级或 33 级,从地面(可视为第 00 级)走到第 88 级台阶共有多少种不同走法( )

{{ select(7) }}

  • 4444
  • 121121
  • 149149
  • 8181

第 8 题(2 分)

下图为 5×55 \times 5 网格,行号、列号均从 00 开始,# 为障碍,. 为可通行格:

S . . # .
. . . # .
. . . # .
# # . . E
. . . # .

从 S 出发做广度优先搜索(BFS):初始时把 S 入队;每次取出队首格子,按"上、下、左、右"(上=行号减 11,下=行号加 11,左=列号减 11,右=列号加 11)的顺序遍历它的四个相邻格子,越界、障碍或已访问的格子跳过,其余格子标记为已访问并入队。当 E 第一次入队时,已经入队过的格子(含 S 和 E)共有多少个( )

{{ select(8) }}

  • 1515
  • 1212
  • 1414
  • 1313

第 9 题(2 分)

满足 1≤n≤1001 \leq n \leq 100 且 gcd⁡(n,60)=6\gcd(n, 60) = 6 的正整数 nn 共有多少个( )

{{ select(9) }}

  • 88
  • 66
  • 44
  • 55

第 10 题(2 分)

某国硬币面值为 11 元、44 元、66 元且数量不限,凑出 99 元最少需要多少枚( )

{{ select(10) }}

  • 33
  • 44
  • 55
  • 22

第 11 题(2 分)

执行下列代码,输出是( )

01 int a[5] = {1, 3, 5, 7, 9};
02 int *p = a + 2;
03 *(p - 1) = p[0] + p[2];
04 p[1] = *(a + 1) - a[0];
05 cout << a[1] << "," << a[3];

{{ select(11) }}

  • 14,13
  • 8,13
  • 14,7
  • 14,2

第 12 题(2 分)

在含 10001000 个互不相同元素的升序数组中,用二分法查找给定值(返回元素位置或报告不存在),最坏情况下需要与数组元素比较多少次?( )

{{ select(12) }}

  • 500500
  • 99
  • 1111
  • 1010

第 13 题(2 分)

数组 a[1..n]a[1..n] 的前缀和数组 ss(即 s[i]=a[1]+a[2]+⋯+a[i]s[i] = a[1] + a[2] + \cdots + a[i])满足 s[i]=3i2+is[i] = 3i^2 + i。则 a[10]a[10] 的值是( )

{{ select(13) }}

  • 252252
  • 310310
  • 5858
  • 6161

第 14 题(2 分)

数轴上有 77 个点,坐标分别为 11、33、44、77、1010、1515、2020。在数轴上选取一个整数坐标点 PP,使 PP 到这 77 个点的距离之和最小,这个最小距离和是( )

{{ select(14) }}

  • 3737
  • 4242
  • 4040
  • 3838

第 15 题(2 分)

一个无向图有 1010 个顶点,其中 44 个顶点的度为 33,其余顶点的度均为 44,则该图的边数是( )

{{ select(15) }}

  • 3636
  • 1818
  • 1717
  • 2020

第 16 题(13 分)

阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 A,错误填 B;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分。题中"第 N 行"指代码块左侧标注的行号)

(1)

01 #include <iostream>
02 using namespace std;
03 int main() {
04   int n;
05   cin >> n;
06   int x = 1, y = 1;
07   while (n > 0) {
08     if (n % 2 == 0) {
09       ++x;
10     } else {
11       ++x;
12       ++y;
13     }
14     n = n / 2;
15   }
16   cout << x << ' ' << y << endl;
17   return 0;
18 }

以下问题均假定输入的 nn 为不超过 231−12^{31} - 1 的非负整数。

判断题

16.(11 分)当输入为 33 时,程序输出为 3 3。( )

{{ select(16) }}

  • T
  • F
  1. 将第 1111 行的 ++x; 删除后,程序输出的两个数一定相等。( )

{{ select(17) }}

  • T
  • F
  1. 假设输入为非负整数,则程序输出的第一个数一定不小于第二个数。( )

{{ select(18) }}

  • T
  • F

单选题

  1. 将第 77 行的 while (n > 0) 改为 while (n >= 0) 后,程序可能出现的问题是( )。

{{ select(19) }}

  • 陷入死循环
  • 输出结果比原来大
  • 输出结果比原来小
  • 输出结果不受影响
  1. 当输入为 66 时,输出为( )。

{{ select(20) }}

  • 3 3
  • 4 2
  • 4 3
  • 5 2
  1. 若输入 nn 依次取遍 0,1,2,…,231−10, 1, 2, \ldots, 2^{31} - 1 中的所有整数,则程序输出的第二个数恰好为 22 的次数为( )。

{{ select(21) }}

  • 1616
  • 3030
  • 3131
  • 3232

第 17 题(13.5 分)

(2)

01 #include <algorithm>
02 #include <iostream>
03 #include <string>
04 using namespace std;
05 int a[100007], b[100007], c[100007], carry[100007];
06 string input_str;
07 int a_len, b_len;
08 int main() {
09   cin >> input_str;
10   a_len = input_str.size();
11   for (int i = 0; i < a_len; i++) {
12     a[i] = input_str[a_len - i - 1] - '0';
13   }
14   cin >> input_str;
15   b_len = input_str.size();
16   for (int i = 0; i < b_len; i++) {
17     b[i] = input_str[b_len - i - 1] - '0';
18   }
19   carry[0] = 0;
20   for (int i = 0; i < max(a_len, b_len) + 1; i++) {
21     c[i] = a[i] + b[i] + carry[i];
22     if (c[i] >= 10) {
23       carry[i + 1] = 1;
24       c[i] -= 10;
25     } else {
26       carry[i + 1] = 0;
27     }
28   }
29   for (int i = max(a_len, b_len); i >= 0; i--) {
30     cout << c[i];
31   }
32   cout << endl;
33   return 0;
34 }

本题输入的两个数均为非负整数,位数不超过 100000100000,可能包含前导零。

判断题

  1. 当输入为 123 456 时,程序输出为 0579。( )

{{ select(22) }}

  • T
  • F
  1. 假设输入的两个数均不含前导零,则程序输出的结果也一定不会含有前导零。( )

{{ select(23) }}

  • T
  • F
  1. 将第 2121 行改为 c[i]=a[i]+b[i]; 后,程序输出的结果一定比原来的结果小。( )

{{ select(24) }}

  • T
  • F

单选题

  1. 当输入为 12345 678 时,输出为( )。

{{ select(25) }}

  • 012923
  • 013023
  • 13023
  • 130230
  1. 将第 2222 行的 if (c[i]>=10) 改为 if (c[i]>10) 后,当输入为 95 15 时,输出为( )。

{{ select(26) }}

  • 01010
  • 110
  • 140
  • 1410
  1. 假设输入的两个数均为 nn 位正整数(不含前导零),且它们的和小于 10n10^n,则程序输出的字符串一定满足( )。

{{ select(27) }}

  • 第一个字符一定不为 '0'
  • 长度一定为 nn
  • 长度一定为 n+1n + 1,且第一个字符为 '0'
  • 长度可能为 n+2n + 2

第 18 题(13.5 分)

(3)

01 #include <iostream>
02 using namespace std;
03 bool check_prime(int x) {
04   if (x <= 1) return false;
05   for (int i = 2; i * i <= x; i++) {
06     if (x % i == 0) return false;
07   }
08   return true;
09 }
10 int n;
11 void search_result(int x) {
12   if (!check_prime(x)) return;
13   if (x >= n) {
14     cout << x << endl;
15     return;
16   }
17   for (int i = 0; i <= 9; i++) {
18     search_result(x * 10 + i);
19   }
20 }
21 int main() {
22   cin >> n;
23   for (int i = 1; i <= 9; i++) search_result(i);
24   return 0;
25 }

判断题

  1. 当输入为 1010 时,程序的输出共有 1010 行。( )

{{ select(28) }}

  • T
  • F
  1. 若输入的 nn 不大于 55,则程序的输出中一定包含 55。( )

{{ select(29) }}

  • T
  • F
  1. 若输入的 nn 大于 1010,将第 1717 行的 for (int i=0;i<=9;i++) 改为 for (int i=1;i<=9;i+=2) 后,程序的输出结果一定不变。( )

{{ select(30) }}

  • T
  • F

单选题

  1. 当输入为 2424 时,程序输出的第 33 行为( )。

{{ select(31) }}

  • 2323
  • 2929
  • 3131
  • 239239
  1. 下列关于该程序输出的说法中,正确的是( )。

{{ select(32) }}

  • 输出的数一定按照从小到大的顺序排列
  • 随着输入 nn 的增大,输出的行数一定不会增加
  • 输出的数的个位数字只可能是 33 或 77
  • 输出的每个大于等于 1010 的数,十进制下删去它的末位数字后得到的数一定是质数
  1. 当输入为 200200 时,程序输出的行数为( )。

{{ select(33) }}

  • 1212
  • 1313
  • 1414
  • 1515

第 19 题(15 分)

三、完善程序(单选题,每小题 3 分,共计 30 分。题中"第 N 行"指代码块左侧标注的行号)

(1)(进制减半)给定 n,mn, m,再给定一个 mnmn 进制下的数 AA,其各个数位上的数按照从高位到低位的顺序给出,请你将其转化为 nn 进制,并同样按照从高位到低位的顺序输出。

输入的第一行依次为 nn、mm 和 AA 的位数 dd,接下来 dd 个数 ad,ad−1,⋯ ,a1a_d, a_{d-1}, \cdots, a_1 从高位到低位描述各个数位上的数。

数据满足 2≤n,m≤102 \leq n, m \leq 10,1≤d≤181 \leq d \leq 18,0≤A<2630 \leq A < 2^{63},对于所有 1≤i≤d1 \leq i \leq d,0≤ai<mn0 \leq a_i < mn。

以下程序按"逐位除以 nn"的方法完成进制转换。请补全程序。

01 #include <iostream>
02
03 constexpr int N = 100005;
04 long long b[N];
05
06 int main() {
07   long long n, m, d;
08   std::cin >> n >> m >> d;
09   int len = 1;
10   for (int i = 0; i < d; i++) {
11     long long x;
12     std::cin >> x;
13     for (int j = len; j >= 1; j--)
14       b[j] = ①;
15     b[0] = ②;
16     len++;
17     for (int j = 0; j < len; j++)
18       if (b[j] >= n) {
19         b[j + 1] += ③;
20         b[j] = ④;
21         if (j + 1 == len) len++;
22       }
23   }
24   while (⑤) len--;
25   for (int i = len - 1; i >= 0; i--)
26     std::cout << b[i] << ' ';
27   return 0;
28 }
  1. ①处应填( )

{{ select(34) }}

  • b[j] * n
  • b[j] * m
  • b[j - 1] * n
  • b[j - 1] * m
  1. ②处应填( )

{{ select(35) }}

  • x * n
  • x
  • 0
  • m
  1. ③处应填( )

{{ select(36) }}

  • b[j] / m
  • b[j] % n
  • b[j] % m
  • b[j] / n
  1. ④处应填( )

{{ select(37) }}

  • b[j] / m
  • b[j] % n
  • b[j] % m
  • b[j] / n
  1. ⑤处应填( )

{{ select(38) }}

  • len > 0 && b[len - 1] == 0
  • len > 0 && b[0] == 0
  • len > 1 && b[len - 1] == 0
  • len > 1 && b[0] == 0

第 20 题(15 分)

(2)(平衡分割)给定一个长度为 nn 的字符串,其中每个字符都是一个十六进制数位。例如,字符串 016A 表示十进制下的四个数 00、11、66、1010。

现在请选择 kk 个(kk 是你选定的数)切分位置 p1,p2,…,pkp_1, p_2, \ldots, p_k,其中 1≤k<n1 \leq k < n,且 1≤p1<p2<⋯<pk<n1 \leq p_1 < p_2 < \cdots < p_k < n。再令 p0=0p_0 = 0,pk+1=np_{k+1} = n。

对于每个 0≤i≤k0 \leq i \leq k,计算第 pi+1p_i + 1 个数到第 pi+1p_{i+1} 个数的平均值,记作 bib_i。你的目标是使 b0,b1,…,bkb_0, b_1, \ldots, b_k 中最大值与最小值之差尽可能小,并输出这个最小值。

其中 2≤n≤202 \leq n \leq 20。输入字符串中的字符只可能是 0~9 或 A~F。本题假定字符采用 ASCII 编码。输出答案时保留小数点后 66 位。

以下程序通过递归枚举所有可能的连续分段方案。请补全程序。

01 #include <algorithm>
02 #include <iomanip>
03 #include <iostream>
04
05 using namespace std;
06
07 constexpr int N = 25;
08 int n;
09 char s[N];
10 double ans = 1e100;
11
12 int get_val(char c) { return ①; }
13
14 void split(int l, int cnt, double minb, double maxb) {
15   if (l > n) {
16     if (cnt == 0) return;
17     ans = min(ans, maxb - minb);
18     return;
19   }
20   int sum = 0;
21   for (②) {
22     sum += ③;
23     double nwb = ④;
24     split(⑤);
25   }
26 }
27
28 int main() {
29   cin >> n >> s + 1;
30   split(1, -1, 1e100, -1e100);
31   cout << fixed << setprecision(6) << ans;
32   return 0;
33 }
  1. ①处应填( )

{{ select(39) }}

  • c <= '9' ? c - '0' : c - 'A' + 10
  • c <= '9' ? c - '0' : c - 'A'
  • c <= '9' ? c - '0' + 1 : c - 'A' + 10
  • c <= '9' ? c - '0' : c - 'A' + 9
  1. ②处应填( )

{{ select(40) }}

  • int r = l; r <= n; r++
  • int r = l; r < n; r++
  • int r = 1; r <= n; r++
  • int r = l; r++ < n
  1. ③处应填( )

{{ select(41) }}

  • get_val(s[r])
  • get_val(s[r-1])
  • s[r-1]
  • s[r]
  1. ④处应填( )

{{ select(42) }}

  • sum/(r-l+1)
  • 1.0*sum/(r-l+1)
  • 1.0*sum/(r-l)
  • sum*1.0/n
  1. ⑤处应填( )

{{ select(43) }}

  • r+1, cnt+1, min(minb,nwb), max(maxb,nwb)
  • r, cnt+1, minb, maxb
  • r+1, cnt, nwb, nwb
  • r, cnt, min(minb,nwb), max(maxb,nwb)