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
解析: 输出最终候选人编号。


Read more

C++:继承

C++:继承

Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。 我的博客:<但愿. 我的专栏:C语言、题目精讲、算法与数据结构、C++ 欢迎点赞,关注 目录   一 继承的概念及定义        1.1继承的概念        1.2继承的定义               1.2.1定义格式               1.2.2类继承基类方式改变对应成员访问⽅式的变化               1.2.3  继承类模板【类继承类似】      二 基类和派⽣类间的转换          2.1不同的转换方式                 2.1.1会产生临时变量                 2.1.2不会产生临时变量(基类和派⽣类间的转换)                         2.1.2.1不会产生临时变量(

By Ne0inhk

Windows系统必备:Visual C++运行库全面修复指南

Windows系统必备:Visual C++运行库全面修复指南 【免费下载链接】vcredistAIO Repack for latest Microsoft Visual C++ Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 作为Windows系统的重要组成部分,Visual C++运行库(Microsoft Visual C++ Redistributable)是众多应用程序和游戏正常运行的基础组件。当您遇到"缺少MSVCR100.dll"、"无法启动程序"等错误提示时,往往是运行库(Runtime Libraries)出现了问题。本文将通过"问题诊断→解决方案→场景应用→长效维护&

By Ne0inhk
C++ 手写 List 容器实战:从双向链表原理到完整功能落地,附源码与测试验证

C++ 手写 List 容器实战:从双向链表原理到完整功能落地,附源码与测试验证

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 底层原理:List 容器的 “骨架”—— 带头双向循环链表 * 1.1 结构组成与优势 * 1.2 核心特性(对比 vector) * 二. 模块实现:Lotso 命名空间下的 List 核心代码 * 2.1 模块 1:链表节点(list_node)—— 容器的 “基本单元” * 2.1.1 代码实现(来自 list.h) * 2.

By Ne0inhk