CSP-J 初赛模拟卷(2026 年备考专用)
CSP-J 初赛模拟卷(2026 年备考专用)
姓名:__________________得分:________
一、单项选择题(共 20 题,每题 1.5 分,共计 30 分;每题有且仅有一个正确选项)
- 下列存储器中,存取速度最快的是( )
A. 硬盘 B. 光盘 C. 内存 D. 寄存器 - 二进制数 101101.11 转换成八进制数是( )
A. 55.6 B. 55.3 C. 55.7 D. 55.4 - 以下关于 IP 地址的说法,正确的是( )
A. IPv4 地址是 32 位二进制数
B. IPv6 地址是 64 位二进制数
C. 每个域名对应唯一的 IP 地址
D. 127.0.0.1 是广播地址 - 在 C++ 中,以下哪个关键字用于在函数中声明静态局部变量?( )
A. auto B. static C. extern D. register - 一棵完全二叉树共有 100 个结点,则叶子结点的个数为( )
A. 50 B. 49 C. 51 D. 不确定 - 某算法的复杂度为Onlogn
,当n=1024
时用时约 10 ms,那么当n=2048
时,理论上用时最接近( )
A. 20 ms B. 22 ms C. 30 ms D. 40 ms - 将中缀表达式 (A+B)*C-D/E 转换为后缀表达式,结果是( )
A. AB+C*DE/- B. AB+C*D/E- C. ABC+*DE/- D. ABC+*DE/- - 以下排序算法中,平均时间复杂度为On2
且是稳定排序的是( )
A. 选择排序 B. 插入排序 C. 快速排序 D. 归并排序 - 一个栈的入栈序列为 1, 2, 3, 4, 5,以下哪个不可能是出栈序列?( )
A. 1, 2, 3, 4, 5 B. 3, 2, 1, 5, 4 C. 4, 1, 3, 2, 5 D. 2, 1, 4, 3, 5 - 有 5 个城市,两两之间都有直达航线,则共需要( )种不同机票(往返视为不同)
A. 20 B. 10 C. 25 D. 15 - 在 C++ 中,若 int a[5] = {1, 2, 3, 4, 5};,则 *(a+2) 的值为( )
A. 2 B. 3 C. 4 D. 5 - (略图)已知一个图的邻接矩阵如下(假设有顶点 0~3,矩阵中 1 表示有边):
text
0 1 0 0
0 0 1 0
0 0 0 1
0 0 0 0
该图是( )
A. 有向图且强连通 B. 有向图但非强连通 C. 无向图 D. 非连通图
- 以下哪个不是合法的 C++ 标识符?( )
A. _123 B. int_ C. 2abc D. abc2 - 十进制数 -27 的 8 位二进制补码表示为( )
A. 11100101 B. 11100100 C. 10011011 D. 10011010 - 若某二叉树的前序遍历序列为 ABDECF,中序遍历为 DBEAFC,则其后序遍历为( )
A. DEBFCA B. DEBFAC C. EDBFCA D. DBEFCA - 下列哪种算法通常用于求单源最短路径?( )
A. Floyd B. Dijkstra C. Prim D. Kruskal - 在 C++ 中,sizeof(char) 的返回值是( )
A. 1 B. 2 C. 4 D. 8 - 由 3 个不同元素构成的集合,其所有非空子集共有( )个
A. 6 B. 7 C. 8 D. 9 - 以下关于递归的说法,错误的是( )
A. 递归必须有终止条件
B. 递归算法空间复杂度可能很高
C. 所有递归都可以转换成非递归
D. 递归的效率一定高于循环 - 逻辑表达式 !(a || b) 等价于( )
A. !a && !b B. !a || !b C. !a && b D. a && !b
二、程序阅读理解题(共 3 大题,每大题含判断题和选择题,判断题 1.5 分,选择题 4 分,共计 40 分)
第一大题(本题共 3 个判断题,每题 1.5 分;2 个选择题,每题 4 分,共 12.5 分)
阅读以下程序:
cpp
#include <iostream>
using namespace std;
int main() {
int n, m = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int j = i;
while (j % 5 == 0) {
m++;
j /= 5;
}
}
cout << m << endl;
return 0;
}
判断题(正确的打 √,错误的打 ×)
(1) 当输入为 10 时,程序输出 2。 ( )
(2) 该程序的功能是计算n!中因子 5 的个数。 ( )
(3) 当输入为 25 时,程序输出 6。 ( )
选择题(每题 4 分,单选)
(4) 若输入为 100,则输出为( )
A. 20 B. 24 C. 25 D. 30
(5) 若将 while (j % 5 == 0) 改为 while (j % 2 == 0),其他不变,输入为 10 时输出为( )
A. 5 B. 8 C. 10 D. 15
第二大题(本题共 3 个判断题,每题 1.5 分;2 个选择题,每题 4 分,共 12.5 分)
阅读以下程序:
cpp
#include <iostream>
using namespace std;
int f(int x) {
if (x == 0) return 0;
if (x == 1) return 1;
return f(x-1) + f(x-2);
}
int main() {
int n;
cin >> n;
cout << f(n) << endl;
return 0;
}
判断题
(1) 该函数 f(n) 计算的是斐波那契数列的第n项(f0=0,f1=1
)。( )
(2) 当输入为 6 时,程序输出 8。( )
(3) 该程序的递归深度为n(假设栈足够)。( )
选择题
(4) 当输入为 8 时,f(3) 被调用了( )次(不计算 f(0) 和 f(1) 作为底层的调用,只算作为参数调用的次数)?
A. 3 B. 5 C. 8 D. 13
(5) 将 return f(x-1) + f(x-2); 改为 return f(x-2) + f(x-1);,输入为 5,输出( )
A. 5 B. 不变,仍为 5 C. 4 D. 6
第三大题(本题共 2 个判断题,每题 1.5 分;3 个选择题,每题 4 分,共 15 分)
阅读以下程序:
cpp
#include <iostream>
using namespace std;
int main() {
int a[5] = {3, 1, 4, 1, 5};
int cnt = 0;
for (int i = 0; i < 5; i++) {
for (int j = i+1; j < 5; j++) {
if (a[i] > a[j]) cnt++;
}
}
cout << cnt << endl;
return 0;
}
判断题
(1) 程序输出的是数组中的逆序对个数。( )
(2) 若将 a[i] > a[j] 改为 a[i] < a[j],则输出变为 10 - 原输出。( )(提示:总对数 = 10)
选择题
(3) 该程序输出的值为( )
A. 4 B. 5 C. 6 D. 7
(4) 若数组改为 {5,4,3,2,1},输出为( )
A. 10 B. 9 C. 8 D. 7
(5) 若将内外层循环互换(即 for (int j=0; j<5; j++) for (int i=0; i<j; i++)),保持判断条件不变,则输出( )
A. 不变 B. 变为 0 C. 变为原输出的相反数 D. 变为总对数减原输出
三、程序完善题(共 2 题,每题 5 个空,每空 3 分,共计 30 分)
第一题(二分查找)
给定一个长度为n的有序数组a
(下标从 1 开始)和一个目标值x
,使用二分查找算法找出x
在数组中的位置,若不存在则输出 -1。请将代码空缺处补充完整。
cpp
#include <iostream>
using namespace std;
const int MAXN = 1000;
int a[MAXN];
int main() {
int n, x;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
cin >> x;
int left = 1, right = n, ans = -1;
while ( (1) ) {
int mid = (2);
if (a[mid] == x) {
ans = mid;
break;
} else if (a[mid] < x) {
(3);
} else {
(4);
}
}
cout << (5) << endl;
return 0;
}
选项(每空选择一个)
(1) A. left < right B. left <= right C. left + 1 < right D. left != right
(2) A. (left + right) / 2 B. (left + right) >> 1 C. left + (right - left) / 2 D. 以上均可
(3) A. left = mid B. left = mid + 1 C. right = mid D. right = mid - 1
(4) A. left = mid B. left = mid + 1 C. right = mid D. right = mid - 1
(5) A. ans B. x C. left D. right
第二题(埃氏筛法)
输入一个正整数n,输出 1 到n
之间(包含n
)的素数个数。下面程序使用埃氏筛法,请补全空缺。
cpp
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 100000;
bool isPrime[MAXN];
int main() {
int n, cnt = 0;
cin >> n;
memset(isPrime, true, sizeof(isPrime));
isPrime[0] = isPrime[1] = false;
int limit = (5);
for (int i = 2; i <= limit; i++) {
if ( (1) ) {
for (int j = i * i; j <= n; j += i) {
(2);
}
}
}
for (int i = 2; i <= n; i++) {
if ( (3) ) cnt++;
}
cout << (4) << endl;
return 0;
}
选项
(1) A. isPrime[i] B. !isPrime[i] C. i D. true
(2) A. isPrime[j] = false B. isPrime[j] = true C. j += i D. break
(3) A. isPrime[i] B. !isPrime[i] C. cnt D. i
(4) A. cnt B. n C. limit D. cnt+1
(5) A. sqrt(n) B. n/2 C. n D. sqrt(n)+1
