2023 CSP-J 第一轮(入门级)真题完整版(42 题)
本文收录 2023 年 CSP-J 第一轮(入门级)认证 全部客观题真题,共 42 题、满分 100 分,供考生限时自测。本文不含答案,做完请对照本站解析篇《2023 CSP-J 第一轮(入门级)参考答案与逐题解析(42 题全)》。
卷面结构
| 题型 | 题数 | 分值 | 说明 |
|---|---|---|---|
| 单项选择题 | 15 | 30 | 每题 2 分,唯一正确选项 |
| 阅读程序 | 17 | 40 | 判断题 1.5⁄2 分、选择题 3⁄4 分(卷面原值,详见题面标注) |
| 完善程序 | 10 | 30 | 每空 3 分 |
自测建议
- 严格限时 60 分钟,模拟真实考场,中途不查资料;
- 单选快速作答,把时间留给阅读程序与完善程序;
- 做完先自行估分,再对照解析篇查漏补缺;
- 本站提供该年分三卷(R1A / R1B / R1C)的 Hydro 客观题包,可在 OJ 导入练习、自动判分。
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
在 C++ 中,下面哪个关键字用于声明一个变量,其值不能被修改?( ) A. unsigned B. const C. static D. mutable
八进制数 12345670(8) 和 07654321(8) 的和为( ) A. 22222221(8) B. 21111111(8) C. 22111111(8) D. 22222211(8)
阅读下述代码,请问修改 data 的 value 成员以存储 3.14,正确的方式是( )。
union Data {
int num;
float value;
char symbol;
};
union Data data;
A. data.value = 3.14; B. value.data = 3.14; C. data->value = 3.14; D. value->data = 3.14;
- 假设有一个链表的节点定义如下:
struct Node {
int data;
Node* next;
};
现在有一个指向链表头部的指针:Node* head。如果想要在链表中插入一个新节点,其成员 data 的值为 42,并使新节点成为链表的第一个节点,下面哪个操作是正确的?( )
A. Node* newNode = new Node; newNode->data = 42; newNode->next = head; head = newNode;
B. Node* newNode = new Node; head->data = 42; newNode->next = head; head = newNode;
C. Node* newNode = new Node; newNode->data = 42; head->next = newNode;
D. Node* newNode = new Node; newNode->data = 42; newNode->next = head;
根节点的高度为 1,一根拥有 2023 个节点的三叉树高度至少为( )。( ) A. 6 B. 7 C. 8 D. 9
小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息,则小明一共有( )种选择时间段的方案。( ) A. 31 B. 18 C. 21 D. 33
以下关于高精度运算的说法错误的是( )。( ) A. 高精度计算主要是用来处理大整数或需要保留多位小数的运算。 B. 大整数除以小整数的处理步骤可以是:将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商。 C. 高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关。 D. 高精度加法运算的关键在于逐位相加并处理进位。
后缀表达式
6 2 3 + - 3 8 2 / + * 2 ^ 3 +对应的中缀表达式是( )。( ) A.((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3B.6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3C.(6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3D.6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3数 101010(2) 和 166(8) 的和为( )。( ) A. 10110000(2) B. 236(8) C. 158(10) D. A0(16)
假设有一组字符 {a, b, c, d, e, f},对应的频率分别为 5%、9%、12%、13%、16%、45%。请问以下哪个选项是字符 a, b, c, d, e, f 分别对应的一组哈夫曼编码?( ) A. 1111,1110,101,100,110,0 B. 1010,1001,1000,011,010,00 C. 000,001,010,011,10,11 D. 1010,1011,110,111,00,01
给定一棵二叉树,其前序遍历结果为:ABDECFG,中序遍历结果为:DEBACFG。请问这棵树的正确后序遍历结果是什么?( ) A. EDBGFCA B. EDBGCFA C. DEBGFCA D. DBEGFCA
考虑一个有向无环图,该图包括 4 条有向边:(1,2),(1,3),(2,4) 和 (3,4)。以下哪个选项是这个有向无环图的一个有效的拓扑排序?( ) A. 4,2,3,1 B. 1,2,3,4 C. 1,2,4,3 D. 2,1,3,4
在计算机中,以下哪个选项描述的数据存储容量最小?( ) A. 字节(byte) B. 比特(bit) C. 字(word) D. 千字节(kilobyte)
一个班级有 10 个男生和 12 个女生。如果要选出一个 3 人的小组,并且小组中必须至少包含 1 个女生,那么有多少种可能的组合?( ) A. 1420 B. 1770 C. 1540 D. 2200
以下哪个不是操作系统?( ) A. Linux B. Windows C. Android D. HTML
二、阅读程序(判断题正确填√,错误填×;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
程序(1)
#include <iostream>
#include <cmath>
using namespace std;
double f(double a, double b, double c) {
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c)); // 第 7 行
}
int main() {
cout.flags(ios::fixed);
cout.precision(4);
int a, b, c;
cin >> a >> b >> c;
cout << f(a, b, c) << endl;
return 0;
}
假设输入的所有数都为不超过 1000 的正整数,完成下面的判断题和单选题:
当输入为“2 2 2”时,输出为“1.7321”( ) A. √ B. ×
将第 7 行中的“(s-b)(s-c)”改为“(s-c)(s-b)”不会影响程序运行的结果( ) A. √ B. ×
程序总是输出四位小数( ) A. √ B. ×
当输入为“3 4 5”时,输出为( ) A. “6.0000” B. “12.0000” C. “24.0000” D. “30.0000”
当输入为“5 12 13”时,输出为( ) A. “24.0000” B. “30.0000” C. “60.0000” D. “120.0000”
程序(2)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int f(string x, string y) {
int m = x.size();
int n = y.size();
vector<vector<int>> v(m + 1, vector<int>(n + 1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (x[i - 1] == y[j - 1]) {
v[i][j] = v[i - 1][j - 1] + 1;
} else {
v[i][j] = max(v[i - 1][j], v[i][j - 1]);
}
}
}
return v[m][n]; // 第 19 行
}
bool g(string x, string y) {
if (x.size() != y.size()) {
return false;
}
return f(x + x, y) == y.size();
}
int main() {
string x, y;
cin >> x >> y;
cout << g(x, y) << endl;
return 0;
}
假设输入的两个字符串长度不超过数组定义的范围,完成下面的判断题和单选题:
f 函数的返回值小于等于 min(n, m)( ) A. √ B. ×
f 函数的返回值等于两个输入字符串的最长公共子串的长度( ) A. √ B. ×
当输入两个完全相同的字符串时,g 函数的返回值总是 true( ) A. √ B. ×
将第 19 行中的“v[m][n]”替换为“v[n][m]”,那么该程序( ) A. 行为不变 B. 只会改变输出 C. 一定非正常退出 D. 可能非正常退出
当输入为“csp-j”和“p-jcs”时,输出为( ) A. “T” B. “F” C. “0” D. “1”
当输入为“csppsc”和“spsccp”时,输出为( ) A. “T” B. “F” C. “0” D. “1”
程序(3)
#include <iostream>
#include <cmath>
using namespace std;
int solve1(int n) {
return n * n;
}
int solve2(int n) {
int sum = 0;
for (int i = 1; i <= sqrt(n); i++) {
if (n % i == 0) {
if (n / i == i) { // 第 13 行
sum += i * i; // 第 14 行
} else {
sum += i * i + (n / i) * (n / i);
}
}
}
return sum;
}
int main() {
int n;
cin >> n;
cout << solve2(solve1(n)) << " " << solve1(solve2(n)) << endl;
return 0;
}
假设输入的 n 是绝对值不超过 1000 的整数,完成下面的判断题和单选题:
如果输入的 n 为正整数,solve2 函数的作用是计算 n 所有的因子的平方和( ) A. √ B. ×
第 13~14 行的作用是避免 n 的平方根因子 i(或 n/i)进入第 16 行而被计算两次( ) A. √ B. ×
如果输入的 n 为质数,solve2(n) 的返回值为 n^2 + 1( ) A. √ B. ×
如果输入的 n 为质数 p 的平方,那么 solve2(n) 的返回值为( ) A. p^2 + p + 1 B. n^2 + n + 1 C. n^2 + 1 D. p^4 + 2p^2 + 1
当输入为正整数时,第一项减去第二项的差值一定( ) A. 大于 0 B. 大于等于 0 且不一定大于 0 C. 小于 0 D. 小于等于 0 且不一定小于 0
当输入为“5”时,输出为( ) A. “651 625” B. “650 729” C. “651 676” D. “652 625”
三、完善程序(单选题,每小题 3 分,共计 30 分)
程序(1)寻找被移除的元素
问题:原有长度为 n+1、公差为 1 的升序数列,将数列输入到程序的数组时移除了一个元素,导致长度为 n 的数组可能不再连续(除非被移除的是第一个或最后一个元素)。需要在数组不连续时,找出被移除的元素。试补全程序。
#include <iostream>
#include <vector>
using namespace std;
int find_missing(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == mid + ①) {
②;
} else {
③;
}
}
return ④;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) cin >> nums[i];
int missing_number = find_missing(nums);
if (missing_number == ⑤) {
cout << "Sequence is consecutive" << endl;
} else {
cout << "Missing number is " << missing_number << endl;
}
return 0;
}
①处应填( ) A. 1 B. nums[0] C. right D. left
②处应填( ) A. left = mid + 1 B. right = mid - 1 C. right = mid D. left = mid
③处应填( ) A. left = mid + 1 B. right = mid - 1 C. right = mid D. left = mid
④处应填( ) A. left + nums[0] B. right + nums[0] C. mid + nums[0] D. right + 1
⑤处应填( ) A. nums[0] + n B. nums[0] + n - 1 C. nums[0] + n + 1 D. nums[n - 1]
程序(2)编辑距离
给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int min(int x, int y, int z) {
return min(min(x, y), z);
}
int edit_dist_dp(string str1, string str2) {
int m = str1.length();
int n = str2.length();
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0)
dp[i][j] = ①;
else if (j == 0)
dp[i][j] = ②;
else if (③)
dp[i][j] = ④;
else
dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤);
}
}
return dp[m][n];
}
int main() {
string str1, str2;
cin >> str1 >> str2;
cout << "Mininum number of operation:" << edit_dist_dp(str1, str2) << endl;
return 0;
}
①处应填( ) A. j B. i C. m D. n
②处应填( ) A. j B. i C. m D. n
③处应填( ) A. str1[i - 1] == str2[j - 1] B. str1[i] == str2[j] C. str1[i - 1] != str2[j - 1] D. str1[i] != str2[j]
④处应填( ) A. dp[i - 1][j - 1] + 1 B. dp[i - 1][j - 1] C. dp[i - 1][j] D. dp[i][j - 1]
⑤处应填( ) A. dp[i][j] + 1 B. dp[i - 1][j - 1] + 1 C. dp[i - 1][j - 1] D. dp[i][j]
来源说明
题目整理自网络流传的 CCF CSP-J1 真题版本,经多来源交叉核对。其中第 24 题网传答案有误(正确答案为 D:可能非正常退出),第 25、26 题题干网传版本易混淆,已在解析篇标注说明。最终请以 CCF 官方公布为准。



