第 1 题单选题信息表示与计算机系统2 分
CSP-J 2025 同难度自测
2025 难度自测 · 交卷后看答案和建议
按 CSP-J 第一轮初赛的题型、题量和难度结构生成,适合学生在正式刷真题前做一次水平诊断。提交后可查看分数、答案、解析和学习建议。
题量
42 题难度
对齐 2025 初赛记录
提交后计入个人中心第 2 题单选题C++ 语法与类型2 分
在 C++ 中,执行 int x=255; cout<<(x&(x-1)); 后,输出的结果是?( )
第 3 题单选题函数与递归2 分
函数 calc(n) 的定义如下,则 calc(5) 的返回值是多少?( ) int calc(int n){ if (n <= 1) return 1; if (n % 2 == 0) return calc(n / 2) + 1; else return calc(n - 1) + calc(n - 2); }
第 4 题单选题树与二叉树2 分
用 5 个权值 10、12、15、20、25 构造哈夫曼树,该树的带权路径长度是多少?( )
第 5 题单选题图与图遍历2 分
在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?( )
第 6 题单选题组合计数与数论2 分
从 5 位男生和 4 位女生中选出 4 人组成一个学习小组,要求学习小组中男生和女生都有。有多少种不同的选法?( )
第 7 题单选题C++ 语法与类型2 分
假设 a、b、c 都是布尔变量,逻辑表达式 (a&&b)||(!c&&a) 的值与下列哪个表达式不始终相等?( )
第 8 题单选题组合计数与数论2 分
已知 f[0]=1、f[1]=1,并且对于所有 n≥2 有 f[n]=(f[n-1]+f[n-2])%7,那么 f[2025] 的值是多少?( )
第 9 题单选题C++ 语法与类型2 分
下列关于 C++ string 类的说法,正确的是?( )
第 10 题单选题C++ 语法与类型2 分
考虑以下 C++ 函数,在 main 函数调用 solve 后,x 和 y 的值分别是?( ) void solve(int &a, int b){ a = a + b; b = a - b; a = a - b; } int main(){ int x = 5, y = 10; solve(x, y); }
第 11 题单选题组合计数与数论2 分
一个 8×8 的棋盘,左上角坐标为 (1,1),右下角为 (8,8)。一个机器人从 (1,1) 出发,每次只能向右或向下走一格。要到达 (4,5),有多少种不同的路径?( )
第 12 题单选题排序算法2 分
某同学用冒泡排序对数组 [6,1,5,2,4] 进行升序排序,请问需要进行多少次元素交换?( )
第 13 题单选题信息表示与计算机系统2 分
十进制数 720₁₀ 和八进制数 270₈ 的和,用十六进制表示是多少?( )
第 14 题单选题树与二叉树2 分
一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少?( )
第 15 题单选题栈与队列2 分
给定一个初始为空的整数栈 S 和一个空的队列 P。按顺序处理输入的整数序列 A:7、5、8、3、1、4、2。处理规则:①若该数是奇数,压入栈 S;②若该数是偶数且栈 S 非空,弹出栈顶元素加入队列 P;③若该数是偶数且栈 S 为空,不操作。当序列 A 处理完毕后,队列 P 的内容是什么?( )
第 16 题判断题程序阅读与结果判断1 分
阅读下面的程序,回答问题。 inline int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b); } int main(){ int n; scanf("%d", &n); int ans = 0; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) for (int k = j + 1; k <= n; ++k) if (gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i, k) == 1) ++ans; printf("%d\n", ans); } 判断题(1 分):当输入为 2 时,程序并不会执行三重循环内部的 if 判断语句。( 填 √ 或 × )
第 17 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 inline int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b); } int main(){ int n; scanf("%d", &n); int ans = 0; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) for (int k = j + 1; k <= n; ++k) if (gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i, k) == 1) ++ans; printf("%d\n", ans); } 判断题:将 if 判断中的 && gcd(i,k)==1 删去不会影响程序运行结果。( 填 √ 或 × )
第 18 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 inline int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b); } int main(){ int n; scanf("%d", &n); int ans = 0; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) for (int k = j + 1; k <= n; ++k) if (gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i, k) == 1) ++ans; printf("%d\n", ans); } 判断题:当输入的 n≥3 的时候,程序总是输出一个正整数。( 填 √ 或 × )
第 19 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 inline int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b); } int main(){ int n; scanf("%d", &n); int ans = 0; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) for (int k = j + 1; k <= n; ++k) if (gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i, k) == 1) ++ans; printf("%d\n", ans); } 将 gcd 函数中的 return gcd(b, a % b); 改为 return gcd(a, a % b); 后,程序可能出现的问题是( )
第 20 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 inline int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b); } int main(){ int n; scanf("%d", &n); int ans = 0; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) for (int k = j + 1; k <= n; ++k) if (gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i, k) == 1) ++ans; printf("%d\n", ans); } 当输入为 8 的时候,输出为( )
第 21 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 inline int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a % b); } int main(){ int n; scanf("%d", &n); int ans = 0; for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) for (int k = j + 1; k <= n; ++k) if (gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i, k) == 1) ++ans; printf("%d\n", ans); } 调用 gcd(36,42) 会返回( )
第 22 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 int n, k; int a[20000]; int ans[20007]; int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); std::sort(a + 1, a + n + 1); n = std::unique(a + 1, a + n + 1) - a - 1; for (int i = 1, j = 0; i <= n; ++i) { for (; j < i && a[i] - a[j + 1] > k; ++j); ans[i] = ans[j] + 1; } printf("%d\n", ans[n]); } 判断题:当输入为 3 1 3 2 1 时,输出结果为 2。( 填 √ 或 × )
第 23 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 int n, k; int a[20000]; int ans[20007]; int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); std::sort(a + 1, a + n + 1); n = std::unique(a + 1, a + n + 1) - a - 1; for (int i = 1, j = 0; i <= n; ++i) { for (; j < i && a[i] - a[j + 1] > k; ++j); ans[i] = ans[j] + 1; } printf("%d\n", ans[n]); } 判断题:假设输入的 n 为正整数,输出的答案一定小于等于 n,大于等于 1。( 填 √ 或 × )
第 24 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 int n, k; int a[20000]; int ans[20007]; int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); std::sort(a + 1, a + n + 1); n = std::unique(a + 1, a + n + 1) - a - 1; for (int i = 1, j = 0; i <= n; ++i) { for (; j < i && a[i] - a[j + 1] > k; ++j); ans[i] = ans[j] + 1; } printf("%d\n", ans[n]); } 判断题:将 n = std::unique(a+1, a+n+1) - a - 1; 这一行删去后,有可能出现与原本代码不同的输出结果。( 填 √ 或 × )
第 25 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 int n, k; int a[20000]; int ans[20007]; int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); std::sort(a + 1, a + n + 1); n = std::unique(a + 1, a + n + 1) - a - 1; for (int i = 1, j = 0; i <= n; ++i) { for (; j < i && a[i] - a[j + 1] > k; ++j); ans[i] = ans[j] + 1; } printf("%d\n", ans[n]); } 假设输入的 a 数组和 k 均为正整数,执行 for (; j < i && a[i] - a[j + 1] > k; ++j); 这一行代码时,一定满足的条件不包括( )
第 26 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 int n, k; int a[20000]; int ans[20007]; int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); std::sort(a + 1, a + n + 1); n = std::unique(a + 1, a + n + 1) - a - 1; for (int i = 1, j = 0; i <= n; ++i) { for (; j < i && a[i] - a[j + 1] > k; ++j); ans[i] = ans[j] + 1; } printf("%d\n", ans[n]); } 当输入的 n=100、k=2、a={1,2,...,100} 时,输出为( )
第 27 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 int n, k; int a[20000]; int ans[20007]; int main(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); std::sort(a + 1, a + n + 1); n = std::unique(a + 1, a + n + 1) - a - 1; for (int i = 1, j = 0; i <= n; ++i) { for (; j < i && a[i] - a[j + 1] > k; ++j); ans[i] = ans[j] + 1; } printf("%d\n", ans[n]); } 假设输入的 a 数组和 k 均为正整数,但 a 数组不一定有序,若误删去 std::sort(a+1, a+n+1); 这一行,程序有可能出现的问题有( )
第 28 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 判断题:当输入 4 1 2 3 4 1 3 2 2 时,输出为 2。( 填 √ 或 × )
第 29 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 判断题:当程序运行完毕后,对于所有的 1≤i,j≤n,都一定有 f[i][j]≤f[n][n]。( 填 √ 或 × )
第 30 题判断题程序阅读与结果判断1.5 分
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 判断题:将 f[i][j] = std::max(f[i-1][j], f[i][j-1]); 这一行删去后,并不影响程序运行结果。( 填 √ 或 × )
第 31 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 输出的答案满足的性质有( )
第 32 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 如果在双重循环开始前加上以下两行:std::sort(a+1,a+n+1); std::sort(b+1,b+n+1);,则答案会( )
第 33 题单选题程序阅读与结果判断3 分
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 如果输入的 a 数组是 1,2,...,n,而且 b 数组中数字均为 1~n 中的正整数,则上述代码等价于下面哪个问题:( )
第 34 题完善程序完善程序3 分
完善程序:字符串解码。行程长度编码(Run-Length Encoding)是一种无损压缩算法:字符连续出现 N 次(N≥2)压缩为字符加数字 N,只出现 1 次则压缩为该字符本身。以下程序读取压缩字符串并输出解压后的原始字符串,请补全程序中的 ①。 int main(){ string z; cin >> z; string s = ""; for (int i = 0; ①; ) { char ch = z[i]; if (isdigit(z[i + 1])) { int count = 0; i++; while (i < z.length() && isdigit(z[i])) { count = ②; i++; } for (int j = 0; j < ③; ++j) s += ch; } else { s += ④; ⑤; } } cout << s << endl; } ①处应填( )
第 35 题完善程序完善程序3 分
完善程序:字符串解码(接上题)。 int main(){ string z; cin >> z; string s = ""; for (int i = 0; ①; ) { char ch = z[i]; if (isdigit(z[i + 1])) { int count = 0; i++; while (i < z.length() && isdigit(z[i])) { count = ②; i++; } for (int j = 0; j < ③; ++j) s += ch; } else { s += ④; ⑤; } } cout << s << endl; } ②处应填( )
第 36 题完善程序完善程序3 分
完善程序:字符串解码(接上题)。 int main(){ string z; cin >> z; string s = ""; for (int i = 0; ①; ) { char ch = z[i]; if (isdigit(z[i + 1])) { int count = 0; i++; while (i < z.length() && isdigit(z[i])) { count = ②; i++; } for (int j = 0; j < ③; ++j) s += ch; } else { s += ④; ⑤; } } cout << s << endl; } ③处应填( )
第 37 题完善程序完善程序3 分
完善程序:字符串解码(接上题)。 int main(){ string z; cin >> z; string s = ""; for (int i = 0; ①; ) { char ch = z[i]; if (isdigit(z[i + 1])) { int count = 0; i++; while (i < z.length() && isdigit(z[i])) { count = ②; i++; } for (int j = 0; j < ③; ++j) s += ch; } else { s += ④; ⑤; } } cout << s << endl; } ④处应填( )
第 38 题完善程序完善程序3 分
完善程序:字符串解码(接上题)。 int main(){ string z; cin >> z; string s = ""; for (int i = 0; ①; ) { char ch = z[i]; if (isdigit(z[i + 1])) { int count = 0; i++; while (i < z.length() && isdigit(z[i])) { count = ②; i++; } for (int j = 0; j < ③; ++j) s += ch; } else { s += ④; ⑤; } } cout << s << endl; } ⑤处应填( )
第 39 题完善程序完善程序3 分
完善程序:精明与糊涂。有 N 个人,精明人永远能正确判断他人,糊涂人的判断不可靠;已知精明人严格占多数。只能通过 query(i,j) 让第 i 个人判断第 j 个人。以下程序用多数投票法的抵消思想找出一个必然是精明人的候选者,请补全程序。 int N; bool query(int i, int j); int main(){ cin >> N; int candidate = 0; int count = ①; for (int i = 1; i < N; ++i) { if (②) { candidate = i; count = 1; } else { ③ { ④; } else { count++; } } } cout << ⑤ << endl; } ①处应填( )
第 40 题完善程序完善程序3 分
完善程序:精明与糊涂(接上题)。 int N; bool query(int i, int j); int main(){ cin >> N; int candidate = 0; int count = ①; for (int i = 1; i < N; ++i) { if (②) { candidate = i; count = 1; } else { ③ { ④; } else { count++; } } } cout << ⑤ << endl; } ②处应填( )
第 41 题完善程序完善程序3 分
完善程序:精明与糊涂(接上题)。 int N; bool query(int i, int j); int main(){ cin >> N; int candidate = 0; int count = ①; for (int i = 1; i < N; ++i) { if (②) { candidate = i; count = 1; } else { ③ { ④; } else { count++; } } } cout << ⑤ << endl; } ③处应填( )
第 42 题完善程序完善程序3 分