2025 CCF 非专业级别软件能力认证第一轮 (CSP-J1) 入门级 C++ 语言试题(题目+答案+解析)
2025 CCF 非专业级别软件能力认证第一轮 (CSP-J1)
入门级 C++ 语言试题(题目+答案+解析)
TAG:
C++
算法
数据结构
CSP-J
CCF认证
2025CSP-J
程序设计竞赛
CSP2025
题解
编程学习
一、单项选择题 (1 ~ 15)
1.
题目:
一个 32 位无符号整数可以表示的最大值,最接近下列哪个选项?
选项:
- A. 4×1094 × 10⁹4×109
- B. 3×10103 × 10^{10}3×1010
- C. 2×1092 × 10⁹2×109
- D. 2×10102 × 10^{10}2×1010
答案: A
解析: 最大值 232−1≈4.29×1092^{32}-1 \approx 4.29 \times 10^9232−1≈4.29×109,最接近 4×1094×10⁹4×109。
2.
题目:
在 C++ 中,执行
int x =255; cout <<(x &(x -1));输出的结果是?
选项:
- A. 255
- B. 254
- C. 128
- D. 0
答案: B
解析:255&254=0xFF&0xFE=254255 \& 254 = 0xFF \& 0xFE = 254255&254=0xFF&0xFE=254。
3.
题目:
函数 calc(n) 定义如下,则 calc(5) 的返回值是多少?
intcalc(int n){if(n <=1)return1;if(n %2==0)returncalc(n /2)+1;elsereturncalc(n -1)+calc(n -2);}选项:
- A. 5
- B. 6
- C. 7
- D. 8
答案: B
解析: f(0)=1, f(1)=1, f(2)=2, f(3)=3, f(4)=3, f(5)=6。
4.
题目:
用 5 个权值 10, 12, 15, 20, 25 构造哈夫曼树,该树的带权路径长度是多少?
选项:
- A. 176
- B. 186
- C. 196
- D. 206
答案: B
解析: 合并序列:10+12=22, 15+20=35, 22+25=47, 35+47=82,总和=186。
5.
题目:
在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?
选项:
- A. 顶点数
- B. 边数
- C. 顶点数 + 边数
- D. 顶点数 × 2
答案: B
解析: 有向图入度和 = 出度和 = 边数。
6.
题目:
从 5 位男生和 4 位女生中选出 4 人组成一个学习小组,要求小组中男女都有。共有多少种不同的选法?
选项:
- A. 126
- B. 121
- C. 120
- D. 100
答案: C
解析: 总数 C(9,4)=126,减去全男(5)和全女(1),得 120。
7.
题目:
逻辑表达式 (a && b) || (!c && a) 与下列哪个不等价?
选项:
- A. a && (b || !c)
- B. (a || !c) && (b || !c) && (a || a)
- C. a && (!b || c)
- D. (!a || !b) || (a && !c)
答案: C
解析: 原式化简为 a∧(b∨¬c)a \land (b \lor \neg c)a∧(b∨¬c),C 不等价。
8.
题目:
已知 f[0]=1, f[1]=1,f[n]=(f[n-1]+f[n-2])%7,求 f[2025]。
选项:
- A. 2
- B. 4
- C. 5
- D. 6
答案: D
解析: 模 7 的斐波那契周期为 16,2025 mod 16=9,f9=6。
9.
题目:
下列关于 C++ string 的说法正确的是?
选项:
- A. 长度固定
- B. 可用
+连接 string 和 char - C. length() 与 size() 可能不同
- D. 必须以
\0结尾且计入长度
答案: B
解析: 其余均错误。
10.
题目:
voidsolve(int&a,int b){ a = a + b; b = a - b; a = a - b;}intmain(){int x=5,y=10;solve(x,y);}调用后 x,y 的值?
选项:
- A. 5,10
- B. 10,5
- C. 10,10
- D. 5,5
答案: C
解析: a 引用传递,b 值传递,最终 x=10,y=10。
11.
题目:
机器人从 (1,1) 走到 (4,5),只能向右或下走,有多少路径?
选项:
- A. 20
- B. 35
- C. 56
- D. 70
答案: B
解析: 共 7 步,选 3 步向下,C(7,3)=35。
12.
题目:
冒泡排序 {6,1,5,2,4} 升序,需要交换多少次?
选项:
- A. 5
- B. 6
- C. 7
- D. 8
答案: B
解析: 逆序对数=6。
13.
题目:
720₁₀ + 270₈ 的和用十六进制表示是多少?
选项:
- A. 388₁₆
- B. 3DE₁₆
- C. 288₁₆
- D. 990₁₆
答案: A
解析: 720+184=904=0x388。
14.
题目:
1000 个结点的完全二叉树,叶子结点数是多少?
选项:
- A. 499
- B. 512
- C. 500
- D. 501
答案: C
解析: 叶子数=⌊n/2⌋=500。
15.
题目:
队列 A={7,5,8,3,1,4,2},奇数入栈,偶数出栈入队,最终队列 P 内容是?
选项:
- A. 5,1,3
- B. 7,5,3
- C. 3,1,5
- D. 5,1,3,7
答案: A
解析: 按规则操作,结果为 5,1,3。
二、阅读程序 (16 ~ 33)
(1) 三重循环 + gcd
16.
题目:
当输入为 2 时,程序并不会执行第 16 行的判断语句。(判断题)
答案: √
解析: n=2 时最内层 k 循环不进入,判断语句不执行。
17.
题目:
将第 16 行中的 && gcd(i,k) == 1 删去不会影响程序运行结果。(判断题)
答案: ×
解析: 删去后会多计数,结果改变。
18.
题目:
当输入的 n ≥ 3 的时候,程序总是输出一个正整数。(判断题)
答案: √
解析: n≥3 时至少有三元组 (1,2,3) 满足条件,输出为正。
19.
题目:
将第 7 行的 gcd(b,a%b) 改为 gcd(a,a%b) 后,程序可能出现的问题是?
选项:
- A. 输出的答案大于原答案
- B. 输出的答案小于原答案
- C. 程序有可能陷入死循环
- D. 可能发生整型溢出问题
答案: A
解析: 改为 gcd(a,a%b) 后始终返回 a(如 gcd(36,42) 得 36),结果偏大。
20.
题目:
当输入为 8 的时候,输出为?
选项:
- A. 37
- B. 42
- C. 35
- D. 25
答案: D
解析: 计数“两两互素”的三元组,含 1 的有 14,不含 1 的有 11,总计 25。
21.
题目:
调用 gcd(36,42) 会返回?
选项:
- A. 6
- B. 252
- C. 3
- D. 2
答案: A
解析: 标准欧几里得算法,结果为 6。
(2) 双指针 + 去重
22.
题目:
当输入为 3 1 3 2 1 时,输出结果为 2。(判断题)
答案: √
解析: 排序去重后 {1,2,3},输出 2。
23.
题目:
假设输入的 n 为正整数,输出的答案一定小于等于 n,大于等于 1。(判断题)
答案: √
解析: ans[n] 从 1 起步,且不超过去重后的 n。
24.
题目:
将第 14 行的 unique 去重删去后,有可能出现与原本代码不同的输出结果。(判断题)
答案: √
解析: 不去重会影响窗口与计数,结果可能不同。
25.
题目:
执行第 18 行代码时,一定满足的条件不包括?
选项:
- A. j ≤ i
- B. a[i] - a[j] > k
- C. j ≤ n
- D. a[j] < a[i]
答案: B
解析: 循环条件用的是 a[j+1],不保证 a[i]-a[j]>k。
26.
题目:
当输入 n=100, k=2, a={1,2,…,100} 时,输出为?
选项:
- A. 34
- B. 100
- C. 50
- D. 33
答案: A
解析: 每段至多 3 个数,⌈100/3⌉=34。
27.
题目:
若误删去第 13 行的排序,程序可能出现的问题有?
选项:
- A. 输出的答案比原本答案更大
- B. 输出的答案比原本答案更小
- C. 出现死循环行为
- D. 以上均可能发生
答案: D
解析: 不排序会破坏双指针假设,答案可能更大或更小,但循环仍终止。
(3) 二维 DP (LCS 变体)
28.
题目:
当输入 4 1 2 3 4 1 3 2 2 时,输出为 2。(判断题)
答案: √
解析: LCS 长度为 2。
29.
题目:
当程序运行完毕后,对于所有 1 ≤ i,j ≤ n,都一定有 f[i][j] ≤ f[n][n]。(判断题)
答案: √
解析: f[i][j] 为前缀 LCS,整体最优不小于任何前缀最优。
30.
题目:
将第 18 行的 f[i][j] = max(...f[i-1][j], f[i][j-1]) 删去后,并不影响程序运行结果。(判断题)
答案: ×
解析: 删去会使 DP 无法正确传递,答案改变。
31.
题目:
输出的答案满足的性质有?
选项:
- A. 小于等于 n
- B. 大于等于 0
- C. 不一定大于等于 1
- D. 以上均是
答案: D
解析: LCS 长度 ≤ n,≥0,不一定 ≥1。
32.
题目:
如果在循环前加上 sort(a) 和 sort(b),则答案会?
选项:
- A. 变大或不变
- B. 变小或不变
- C. 一定变大
- D. 不变
答案: A
解析: 排序只会使公共子序列不减。
33.
题目:
如果输入 a={1,2,…,n},b 为 1~n 的整数,则上述代码等价于?
选项:
- A. 求 b 数组去重后的长度
- B. 求 b 数组的最长上升子序列
- C. 求 b 数组的长度
- D. 求 b 数组的最大值
答案: B
解析: LCS(a,b) 等价于 b 的 LIS。
三、完善程序 (34 ~ 42)
(1) 字符串解码 (RLE)
33.
题目:
在第 14 行 if ( ... ) && isdigit(z[i+1])) 的空白处应填什么?
选项:
- A. i < z.length()
- B. i - 1 >= 0
- C. i + 1 < z.length()
- D. isdigit(z[i])
答案: C
解析: 需要保证访问 z[i+1] 合法,因此应写 i+1 < z.length()。
34.
题目:
在第 18 行 count = ... ; 的空白处应填什么?
选项:
- A. count + (z[i] = ‘0’)
- B. count * 10 + (z[i] - ‘0’)
- C. z[i] - ‘0’
- D. count + 1
答案: B
解析: 多位数字累积时应写 count = count * 10 + (z[i]-'0')。
35.
题目:
在第 21 行 for (int j=0; j< ... ; ++j) 的空白处应填什么?
选项:
- A. count - 1
- B. count
- C. 10
- D. z[i] - ‘0’
答案: B
解析: 应重复 count 次该字符。
36.
题目:
在第 25 行 s += ... ; 的空白处应填什么?
选项:
- A. z[i+1]
- B. ch
- C. z.back()
- D. (char)z[i] + 1
答案: B
解析: 单次出现直接加入当前字符 ch。
37.
题目:
在第 26 行 ... ; 的空白处应填什么?
选项:
- A. i–
- B. i = i + 2
- C. i++
- D. // 不执行任何操作
答案: C
解析: 消费一个字符后向前推进一位。
(2) 精明与糊涂 (多数派候选消除)
38.
题目:
在第 12 行 int count = ... ; 的空白处应填什么?
选项:
- A. 0
- B. 1
- C. N
- D. -1
答案: B
解析: 初始候选人计数应为 1。
39.
题目:
在第 13 行 if ( ... ) { candidate = i; count=1; } 的空白处应填什么?
选项:
- A. count < 0
- B. count == 1
- C. count == 0
- D. query(candidate,i) == false
答案: C
解析: 当计数为 0 时重置候选人。
40.
题目:
在第 18 行 if ( ... ) { count--; } 的空白处应填什么?
选项:
- A. query(candidate,i) == false
- B. query(i,candidate) == true
- C. query(candidate,i) == false && query(i,candidate) == false
- D. query(candidate,i) == false || query(i,candidate) == false
答案: D
解析: 只要有一方判对方为糊涂,就说明二者不能同时为精明,应抵消。
41.
题目:
在第 19 行 ... ; 的空白处应填什么?
选项:
- A. count–
- B. break
- C. count++
- D. candidate = i
答案: A
解析: 满足抵消条件时,计数减一。
42.
题目:
在第 28 行 cout << ... << endl; 的空白处应填什么?
选项:
- A. N-1
- B. count
- C. candidate
- D. 0
答案: C
解析: 输出最终候选人编号。