ARTICLE · 1044768
CSP-J 2026年初赛真题及详解
CSP-J 2026年初赛真题及详解
下列C++ 数据类型中,能够精确存储 10¹⁸+1 A. float B. long long C. double D. int 答案:B 解析:long long取值范围 [-9×10¹⁸,9×10¹⁸],可以精确存储;float/double存在浮点精度丢失;int范围约±2×10⁹存不下。 十六进制数2F5 转换为八进制数是( ) A. 1364 B. 1635 C. 1405 D. 1365 答案:D 解析:十六进制转二进制:2F5 = 0010 1111 0101;3位一组转八进制得到1365。 A. 9 B. 10 C. 7 D. 6 答案:C 解析:整数除法 7/3=2;2*3=6;7%3=1;6+1=7;恒等式 a = (a/b)*b + a%b。 初始栈空,1、2、3、4依次入栈,入栈可随时出栈,不可能的出栈序列() A. 2,4,3,1 B. 1,2,3,4 C. 3,1,2,4 D. 1,4,3,2 答案:C 解析:栈后进先出。3先出栈,则栈内从底到顶是1,2;接下来只能先出2,不可能直接出1。 一棵有100 个结点的完全二叉树,叶子结点个数是( ) A. 49 B. 50 C. 64 D. 51 答案:B 解析:100个结点完全二叉树,最后一个父节点编号50,50号不存在右孩子;叶子结点数量 100‑50=50。 A. 3048 B. 2733 C. 2318 D. 2418 答案:D 解析:容斥原理:3倍数和 +5倍数和 −15倍数和。sum₃=1683,sum₅=1050,sum₁₅=315;1683+1050‑315=2418。 上楼梯每步1、2、3级,从0级走到8级,多少种不同走法() A. 44 B. 121 C. 149 D. 81 答案:D 解析:递推公式 f[i]=f[i‑1]+f[i‑2]+f[i‑3];边界f[0]=1,f[1]=1,f[2]=2,计算得到f[8]=81。 5 × 5 网格,行号、列号均从0开始,#为障碍,.为可通行格,S起点,E终点。
从S出发BFS:初始S入队;每次取出队首,按上、下、左、右顺序遍历相邻格子;越界、障碍、已访问跳过;其余标记访问并入队。E第一次入队时,已经入队过的格子(含S、E)共有多少个() A.15 B.12 C.14 D.13 答案:C 解析:严格按照上、下、左、右顺序模拟BFS扩展,障碍不可通行;E第一次入队累计入队14格。 满足 1 ≤n ≤100 且 gcd(n, 60)=6 的正整数n共有多少个() A.8 B.6 C.4 D.5 答案:B 解析:求n在1到100之间与60最大公约数为6的n的个数,把60拆分成6*2*5,那n需要是6的倍数但不能是2或者5的倍数,6*1=6,6*3=18,6*7=42,6*9=54,6*11=66,6*13=78。 硬币面值1元、4元、6元,数量不限,凑出9元最少需要多少枚() A.3 B.4 C.5 D.2 答案:A 解析:贪心算法失效,枚举:4+4+1一共3枚,为最优解。 A.14,13 B.8,13 C.14,7 D.14,2 答案:A 解析:p指向a[2]=5;*(p‑1)=a[1]=a[2]+a[4]=5+9=14;p[1]=a[3]=a[1]-a[0]=14‑1=13,输出14,13。 在含1000个互不相同元素的升序数组中,二分查找,最坏情况下需要与数组元素比较多少次?() A.500 B.9 C.11 D.10 答案:D 解析:二分查找最坏比较次数 ⌊log₂N⌋+1;2¹⁰=1024>1000,最坏比较10次。 数组a[1..n]前缀和数组s满足 s[i]=3i²+i,则a[10]的值是() A.252 B.310 C.58 D.61 答案:C 解析:a[i]=s[i]-s[i‑1];s[10]=310,s[9]=252;a[10]=310‑252=58。 数轴上7个点坐标:1、3、4、7、10、15、20。选取整数P,使P到7个点距离之和最小,求最小距离和() A.37 B.42 C.40 D.38 答案:A 解析:距离和最小取中位数,7个点中位数为第4个点7;|7‑1|+|7‑3|+|7‑4|+0+|7‑10|+|7‑15|+|7‑20| = 37。 无向图有10个顶点,4个顶点度为3,其余顶点度均为4,则该图边数是() A.36 B.18 C.17 D.20 答案:B 解析:握手定理,总度数 4×3 + 6×4 = 36;无向图边数 = 总度数 / 2 = 18。 16. 当输入为3 时,程序输出为3 3。() 答案:√ 解析:n=3,每次/2取整,循环两次就是++两次;x=3,y=3,输出3 3。 17.将第11行的++x; 删除后,程序输出的两个数一定相等。() 答案:× 解析:偶数分支仍然执行++x;奇数分支只++y;x,y数值不相等。 18.假设输入为非负整数,则程序输出的第一个数一定不小于第二个数。() 答案:√ 解析:每轮循环x必+1;y只有n为奇数才+1,恒有x≥y。 19.将while (n>0)改为while (n>=0)后,程序可能出现的问题是 ( )。 A. 陷入死循环 B. 输出结果比原来大 C. 输出结果比原来小 D. 输出结果不受影响 答案:A 解析:n=0时n/2依旧等于0,循环条件永久成立,陷入死循环。 20.当输入为 6 时,输出为( )。 A. 3 3 B. 4 2 C. 4 3 D. 5 2 答案:C 解析:n=6,循环3次;1次是2的倍数x++、y不加,所以x是4,y是3。 21.若输入n依次取遍 0,1,2, ..., 2³¹−1中的所有整数,则程序输出的第二个数恰好为2的次数为( )。 A. 16 B. 30 C. 31 D. 32 答案:C 解析:y=2等价二进制恰好1个1,即2⁰,2¹…2³⁰,合计31个数字。 22.当输入为123 456 时,程序输出为0579。() 答案:√ 解析:123+456=579;循环从max_len下标向下打印,最高位是0,输出0579。 23.假设输入的两个数均不含前导零,则程序输出的结果也一定不会含有前导零。( ) 答案:× 解析:直接从最高索引逐位输出,高位为0也会打印,会出现前导0。 24.将第21行改为 c[i]=a[i]+b[i]; 后,程序输出的结果一定比原来的结果小。() 答案:× 解析:当carry[i]=0的时候结果完全不变,不是一定更小。 25.当输入为12345 678 时,输出为( )。 A. 012923 B. 013023 C. 13023 D. 130230 答案:B 解析:12345+678=13023;输出带上最高位0,得到013023。 26.将if (c[i]>=10)改为if (c[i]>10)后,当输入为95 15 时,输出为( )。 A. 01010 B. 110 C. 140 D. 1410 答案:A 解析:95+15=110;条件>10,等于10不会进位,数位出错,输出01010。 27.假设输入的两个数均为n 位正整数(不含前导零),且它们的和小于10ⁿ,则程序输出的字符串一定满足( )。 A.第一个字符一定不为'0' B.长度一定为n C.长度一定为n +1,且第一个字符为'0' D.长度可能为n +2 答案:C 解析:max(a_len,b_len)=n,循环从下标n向下打印;总输出长度n+1,最高位下标n输出0。 28.当输入为10 时,程序的输出共有10 行。( ) 答案:× 解析:输出所有≥10、全部前缀都是质数的数字,行数不等于10。 29.若输入的n 不大于5,则程序的输出中一定包含5。( ) 答案:√ 解析:search_result(5),5≥n,直接打印输出5。 30.若输入的n 大于10,将for (int i=0;i<=9;i++)改为for (int i=1;i<=9;i+=2) 后,程序的输出结果一定不变。( ) 答案:× 解析:修改之后不能追加数字0;部分合法数字无法生成,输出变少。 31.当输入为24 时,程序输出的第3行为( )。 A. 23 B. 29 C. 31 D. 239 答案:B 解析:i从小到大递归;输出顺序:233、239、29、31,第三行为29。 32.下列关于该程序输出的说法中,正确的是( )。 A. 输出的数一定按照从小到大的顺序排列 B. 随着输入n 的增大,输出的行数一定不会增加 C. 输出的数的个位数字只可能是3 或7 D. 输出的每个大于等于10 的数,十进制下删去它的末位数字后得到的数一定是质数 答案:D 解析:A:DFS不是数值升序;B:n变大筛选变严,行数只会减少;C:个位可以是1;D:递归生成规则,父节点一定是质数。 33.当输入为200 时,程序输出的行数为( )。 A. 12 B. 13 C. 14 D. 15 答案:C 解析:枚举全部满足条件合计14个。 34.①处应填( ) A.b[j] * n B.b[j] * m C.b[j-1] * n D.b[j-1] * m 答案:D 解析:读入新数位,旧整体数字乘m,b[j]=b[j-1]*m。 35.②处应填( ) A. x * n B. x C. 0 D. m 答案:B 解析:最低位填入新读入的数位x,b[0]=x。 36.③处应填( ) A.b[j] / m B.b[j] % n C.b[j] % m D.b[j] / n 答案:D 解析:进位等于当前位除以n,b[j+1] += b[j]/n。 37.④处应填( ) A.b[j] / m B.b[j] % n C.b[j] % m D.b[j] / n 答案:B 解析:本位保留除以n的余数,b[j]=b[j]%n。 38.⑤处应填( ) A.len >0 && b[ len -1]==0 B.len >0 && b[0]==0 C.len >1 && b[ len -1]==0 D.len >1 && b[0]==0 答案:C 解析:去除数组高位多余前导0,至少保留1位数字,while(len>1 && b[len‑1]==0) len--;
39.①处应填( ) A. c<='9' ? c-'0' : c-'A'+10 B. c<='9' ? c-' ' : c - 'A' C. c<='9' ? c-'0'+1 : c-'A'+10 D. c<='9' ? c-'0' ; c-'A'+9 答案:A 解析:十六进制字符转数值;数字c‑'0';A‑F映射10‑15。 40.②处应填( ) A.int r=l ; r<=n ; r++ B.int r=l ; r<n section> C.int r=1 ; r<=n ; r++ D.int r=l ; r++<n section> 答案:A 解析:枚举当前分段终点r,起点l,r从l循环至n。 41.③处应填( ) A.get_val(s[r]) B.get_val(s[r-1]) C.s[r-1] D.s[r] 答案:A 解析:使用s+1读入,s[1]是第一个字符;累加当前r位置字符数值get_val(s[r])。 42.④处应填( ) A.sum /(r-1+1) B.1.0 * sum /(r-1+1) C.1.0sum/(r-l) D.sum1.0/n 答案:B 解析:区间[l,r]总元素个数 r‑l+1 = r‑1+1;1.0*sum / 长度强制浮点运算求平均值。 43.⑤处应填( ) A.r+1, cnt+1, min(minb,nwb), max(maxb,nwb) B.r, cnt+1, minb, maxb C.r+1, cnt, nwb, nwb D.r, cnt, min(minb,nwb), max(maxb,nwb) 答案:A 解析:当前段结束于r;下一段起点r+1;分段计数cnt+1;更新全局minb、maxb。

一、单项选择题(共15题,每题2分,共计30分)
第1题
第2题
第3题
int a = 7, b = 3;std::cout << a / b * b + a % b;
第4题
第5题
第6题
int s = 0;for (int i = 1; i <= 100; i++)if (i % 3 == 0 || i % 5 == 0) s += i;
第7题
第8题
第9题
第10题
第11题
int a[5] = {1, 3, 5, 7, 9};int *p = a + 2;*(p - 1) = p[0] + p[2];p[1] = *(a + 1) - a[0];cout << a[1] << "," << a[3];
第12题
第13题
第14题
第15题
二、阅读程序(1)
程序功能:n不断二进制右移;x等于循环总次数+1;y等于二进制中1的个数+1。
#include<iostream>using namespace std;intmain(){int n;cin >> n;int x = 1, y = 1;while (n > 0) {if (n % 2 == 0) {++x;} else {++x;++y;}n = n / 2;}cout << x << ' ' << y << endl;return 0;}
阅读程序(2)大数高精度加法
功能:读取两个数字字符串,反转存储数组,模拟竖式加法;从高位索引向下输出,会输出前导0。
#include<algorithm>#include<iostream>#include<string>using namespace std;int a[100007], b[100007], c[100007], carry[100007];string input_str;int a_len, b_len;intmain(){cin >> input_str;a_len = input_str.size();for (int i = 0; i < a_len; i++){a[i] = input_str[a_len - i - 1] - '0';}cin >> input_str;b_len = input_str.size();for (int i = 0; i < b_len; i++){b[i] = input_str[b_len - i - 1] - '0';}carry[0] = 0;for (int i = 0; i < max(a_len, b_len) + 1; i++){c[i] = a[i] + b[i] + carry[i];if (c[i] >= 10){carry[i + 1] = 1;c[i] -= 10;}else{carry[i + 1] = 0;}}for (int i = max(a_len, b_len); i >= 0; i--){cout << c[i];}cout << endl;return 0;}
阅读程序(3)质数DFS
功能:x是质数,若x≥n直接输出;否则末尾追加0‑9递归,生成前缀全部为质数的数字。
#include<iostream>using namespace std;boolcheck_prime(int x){if (x <= 1) return false;for (int i = 2; i * i <= x; i++){if (x % i == 0) return false;}return true;}int n;voidsearch_result(int x){if (!check_prime(x)) return;if (x >= n){cout << x << endl;return;}for (int i = 0; i <= 9; i++){search_result(x * 10 + i);}}intmain(){cin >> n;for (int i = 1; i <= 9; i++){search_result(i);}return 0;}
三、完善程序(1)进制减半:mⁿ进制转为n进制
#include<iostream>constexpr int N = 100005;long long b[N];intmain(){long long n, m, d;std::cin >> n >> m >> d;int len = 1;for (int i = 0; i < d; i++){long long x;std::cin >> x;for (int j = len; j >= 1; j--)b[j] = ①;b[0] = ②;len++;for (int j = 0; j < len; j++){if (b[j] >= n){b[j + 1] += ③;b[j] = ④;if (j + 1 == len) len++;}}}while (⑤) len--;for (int i = len - 1; i >= 0; i--){std::cout << b[i] << ' ';}return 0;}
完善程序(2)平衡分割:字符串分割,各段平均值最大最小差最小
#include<algorithm>#include<iomanip>#include<iostream>using namespace std;constexpr int N = 25;int n;char s[N];double ans = 1e100;intget_val(char c){return ①;}voidsplit(int l, int cnt, double minb, double maxb){if (l > n){if (cnt == 0) return;ans = min(ans, maxb - minb);return;}int sum = 0;for (②){sum += ③;double nwb = ④;split(⑤);}}intmain(){cin >> n >> s + 1;split(1, -1, 1e100, -1e100);cout << fixed << setprecision(6) << ans;return 0;}
参考答案总表
...............................................................
大厂技术专家转型青少年编程教练
专注线上1对1教学,带孩子探索奇妙编程
有编程学习考级相关问题,欢迎交流