夜雨聆风学习资料网

ARTICLE · 1044768

CSP-J 2026年初赛真题及详解

CSP-J 2026年初赛真题及详解

一、单项选择题(共15题,每题2分,共计30分)

第1题

下列C++ 数据类型中,能够精确存储 10¹⁸+1 A. float B. long long C. double D. int
答案:B
解析:long long取值范围 [-9×10¹⁸,9×10¹⁸],可以精确存储;float/double存在浮点精度丢失;int范围约±2×10⁹存不下。

第2题

十六进制数2F5 转换为八进制数是( ) A. 1364 B. 1635 C. 1405 D. 1365
答案:D
解析:十六进制转二进制:2F5 = 0010 1111 0101;3位一组转八进制得到1365。

第3题

int a = 7, b = 3;std::cout << a / b * b + a % b;
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。

第4题

初始栈空,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。

第5题

一棵有100 个结点的完全二叉树,叶子结点个数是( )
A. 49 B. 50 C. 64 D. 51
答案:B
解析:100个结点完全二叉树,最后一个父节点编号50,50号不存在右孩子;叶子结点数量 100‑50=50。

第6题

int s = 0;for (int i = 1; i <= 100; i++)    if (i % 3 == 0 || i % 5 == 0) s += i;
A. 3048 B. 2733 C. 2318 D. 2418
答案:D
解析:容斥原理:3倍数和 +5倍数和 −15倍数和。sum₃=1683,sum₅=1050,sum₁₅=315;1683+1050‑315=2418。

第7题

上楼梯每步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。

第8题

5 × 5 网格,行号、列号均从0开始,#为障碍,.为可通行格,S起点,E终点。
行\列
0
1
2
3
4
0
S
.
.
#
.
1
.
.
.
#
.
2
.
.
.
#
.
3
#
#
.
.
E
4
.
.
.
#
.
从S出发BFS:初始S入队;每次取出队首,按上、下、左、右顺序遍历相邻格子;越界、障碍、已访问跳过;其余标记访问并入队。E第一次入队时,已经入队过的格子(含S、E)共有多少个()
A.15 B.12 C.14 D.13
答案:C
解析:严格按照上、下、左、右顺序模拟BFS扩展,障碍不可通行;E第一次入队累计入队14格。

第9题

满足 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。

第10题

硬币面值1元、4元、6元,数量不限,凑出9元最少需要多少枚()
A.3 B.4 C.5 D.2
答案:A
解析:贪心算法失效,枚举:4+4+1一共3枚,为最优解。

第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];
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。

第12题

在含1000个互不相同元素的升序数组中,二分查找,最坏情况下需要与数组元素比较多少次?()
A.500 B.9 C.11 D.10
答案:D
解析:二分查找最坏比较次数 ⌊log₂N⌋+1;2¹⁰=1024>1000,最坏比较10次。

第13题

数组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。

第14题

数轴上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。

第15题

无向图有10个顶点,4个顶点度为3,其余顶点度均为4,则该图边数是()
A.36 B.18 C.17 D.20
答案:B
解析:握手定理,总度数 4×3 + 6×4 = 36;无向图边数 = 总度数 / 2 = 18。

二、阅读程序(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;}
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个数字。

阅读程序(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;}
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。

阅读程序(3)质数DFS

功能:x是质数,若x≥n直接输出;否则末尾追加0‑9递归,生成前缀全部为质数的数字。

#include<iostream>using namespace std;boolcheck_prime(int x){    if (x <= 1return false;    for (int i = 2; i * i <= x; i++)    {        if (x % i == 0return 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;}
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个。

三、完善程序(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;}
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--;

完善程序(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 == 0return;        ans = min(ans, maxb - minb);        return;    }    int sum = 0;    for (②)    {        sum += ③;        double nwb = ④;        split(⑤);    }}intmain(){    cin >> n >> s + 1;    split(1-11e100-1e100);    cout << fixed << setprecision(6) << ans;    return 0;}
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。

参考答案总表

题号
答案
题号
答案
题号
答案
1
B
2
D
3
C
4
C
5
D
6
D
7
D
8
C
9
A
10
A
11
A
12
D
13
C
14
A
15
B
16
17
×
18
19
A
20
B
21
C
22
23
×
24
×
25
B
26
A
27
C
28
×
29
30
×
31
C
32
D
33
B
34
B
35
B
36
D
37
B
38
C
39
A
40
A
41
A
42
B
43
A

...............................................................

大厂技术专家转型青少年编程教练

专注线上1对1教学,带孩子探索奇妙编程

有编程学习考级相关问题,欢迎交流

相关学习资料