#P2869. 2024CSP-J第一轮试题

2024CSP-J第一轮试题

Description

一、单项选择题(共20题,每题1.5分,共计30分)

1. 32位int类型的存储范围是( )

A. -2147483647 ~ +2147483647
B. -2147483647 ~ +2147483648
C. -2147483648 ~ +2147483647
D. -2147483648 ~ +2147483648

2. 计算数学公式:(148 - 10102) × D16 - 11012 的结果,并选择答案的十进制值( )

A. 13
B. 14
C. 15
D. 16

3. 某公司有10名员工,分为3个部门:A部门4人,B部门3人,C部门3人。现需要从这10名员工中选出4名组成一个工作组,且每个部门至少要有1人。问有多少种选择方式?( )

A. 120
B. 126
C. 132
D. 238

4. 以下哪个序列对应数组0至8的4位二进制格雷码(Gray code)( )

A. 0000,0001,0011,0010,0110,0111,0101,1000
B. 0000,0001,0011,0010,0110,0111,0100,0101
C. 0000,0001,0011,0010,0100,0101,0111,0110
D. 0000,0001,0011,0010,0110,0111,0101,0100

5. 记1Kb为1024字节(byte),1MB为1024KB,那么1MB是多少二进制位(bit)( )

A. 1000000
B. 1048576
C. 8000000
D. 8388608

6. 以下哪个不是C++中的基本数据类型( )

A. Int
B. float
C. struct
D. char

7. 以下哪个不是C++中的循环语句( )

A. for
B. while
C. do-while
D. repeat-until

8. 在C/C++中,(char)('a' + 13)与下面的哪一个值相等( )

A. 'm'
B. 'n'
C. 'z'
D. '3'

9. 假设有序表中有1000个元素,则用二分法查找元素x最多需要比较( )次

A. 25
B. 10
C. 7
D. 1

10. 下面哪一个不是操作系统名字( )

A. Notepad
B. Linux
C. Windows
D. macOS

11. 在无向图中,所有顶点的度数之和等于( )

A. 图的边数
B. 图的边数的两倍
C. 图的顶点数
D. 图的顶点数的两倍

12. 已知二叉树的前序遍历为[A,B,D,E,C,F,G],中序遍历为[D,B,E,A,F,C,G],求二叉树的后序遍历的结果是( )

A. [D,E,B,F,G,C,A]
B. [D,E,B,F,G,A,C]
C. [D,B,E,F,G,C,A]
D. [D,E,B,F,G,A,C]

13. 给定一个空栈,支持入栈和出栈操作。若入栈操作的元素依次是1 2 3 4 5 6,其中1最先入栈,6最后入栈,下面哪种出栈顺序是不可能的( )

A. 6 5 4 3 2 1
B. 1 6 5 4 3 2
C. 2 4 6 5 3 1
D. 1 3 5 2 4 6

14. 有5个男生和3个女生站成一排,规定3个女生必须相邻,问有多少种不同的排列方式( )

A. 4320种
B. 5040种
C. 3600种
D. 2880种

15. 编译器的主要作用是什么( )

A. 直接执行源代码
B. 将源代码转换为机器代码
C. 进行代码调试
D. 管理程序运行时的内存


二、阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填对,错误填错;除特殊说明外,判断题1.5分,选择题3分,共计40分)

程序1

#include <iostream> 
using namespace std; 

bool isPrime(int n) { 
    if (n <= 1) { 
        return false; 
    } 
    for (int i = 2; i * i <= n; i++) { 
        if (n % i == 0) { 
            return false; 
        } 
    } 
    return true; 
} 

int countPrimes(int n) { 
    int count = 0; 
    for (int i = 2; i <= n; i++) { 
        if (isPrime(i)) { 
            count++; 
        } 
    } 
    return count; 
} 

int sumPrimes(int n) { 
    int sum = 0; 
    for (int i = 2; i > x; 
    cout << countPrimes(x) << " " << sumPrimes(x) << endl; 
    return 0; 
}


判断题(正确填对,错误填错)

16. 当输入为“10”时,程序的第一个输出为“4”,第二个输出为“17”

A. 正确        B. 错误


17. 若将isPrime(i)函数中的条件改为i <= n / 2,输入“20”时,countPrimes(20)的输出将变为“6”

A. 正确        B. 错误

18. sumPrimes函数计算的是从2到n之间的所有素数之和

A. 正确        B. 错误

单选题

19. 当输入为“50”时,sumPrimes(50)的输出为( )

A. 1060
B. 328
C. 381
D. 275

20. 如果将 for (int i=2; i*i<=n;i++) 改为 for(int i = 2; i <= n; i++),输入 10 时,程序的输出( )。

A. 将不能正确计算10以内素数个数及其和
B. 仍然输出4和17
C. 输出3和10
D. 输出结果不变,但运行时间更短

程序2

#include <iostream>
#include <vector>
using namespace std;

int compute(vector<int>& cost) {
    int n = cost.size();
    vector<int> dp(n+1, 0);
    dp[1] = cost[0];
    for (int i = 2; i <= n; i++) {
        dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1];
    }
    return min(dp[n], dp[n-1]);
}

int main() {
    int n;
    cin >> n;
    vector<int> cost(n);
    for (int i = 0; i < n; i++) {
        cin >> cost[i];
    }
    cout << compute(cost) << endl;
    return 0;
}


判断题

21. 当输入的cost数组为{10,15,20}时,程序的输出为15

A. 正确        B. 错误

22. 如果将dp[i-1]改为dp[i-3],程序可能会产生编译错误

A. 正确        B. 错误

23. 程序总是输出cost数组中的最小元素

A. 正确        B. 错误


单选题

24. 当输入的cost数组为{1,100,1,1,1,100,1,1,100,1}时,程序的输出为( )

A. 6
B. 7
C. 8
D. 9

25. 如果输入的cost数组为{10,15,30,5,5,10,20},程序的输出为( )

A. 25
B. 30
C. 35
D. 40

26. 若将代码中的min(dp[i-1],dp[i-2])+cost[i-1]修改为dp[i-1]+cost[i-2],输入cost数组为{5,10,15}时,程序的输出为( )

A. 10
B. 15
C. 20
D. 25

程序3

#include <iostream>
#include <cmath>
using namespace std;

int customFunction(int a, int b) {
    if (b == 0) {
        return a;
    }
    return a + customFunction(a, b-1);
}

int main() {
    int x, y;
    cin >> x >> y;
    int result = customFunction(x, y);
    cout << pow(result, 2) << endl;
    return 0;
}
判断题

27. 当输入为“2 3”时,customFunction(2,3)的返回值为“64”

A. 正确        B. 错误

28. 当b为负数时,customFunction(a, b)会陷入无限递归

A. 正确        B. 错误

29. 当b的值越大,程序的运行时间越长

A. 正确        B. 错误



单选题

30. 当输入为“5 4”时,customFunction(5,4)的返回值为( )

A. 5
B. 25
C. 250
D. 625

31. 如果输入x = 3和y = 3,则程序的最终输出为( )

A. 27
B. 81
C. 144
D. 256

32. 若将customFunction函数改为return a + customFunction(a-1, b-1),输入“3 3”,则程序的最终输出为( )

A. 9
B. 16
C. 25
D. 36


三、完善程序(单选题,每小题 3 分,共计 30 分)

(判断平方数) 问题:给定一个正整数 n,希望判断这个数是否为完全平方数,即存在一个正整数 x,使得 x 的平方为 n。
试补全程序
#include<iostream> 
#include<vector> 
using namespace std; 

bool isSquare(int num){ 
    int i = (1) ; 
    int bound = (2) ; 
    for(;i<=bound;++i){ 
        if((3) ){ 
            return (4) ; 
        } 
    } 
    return (5) ; 
} 
int main(){ 
    int n;  
    cin>>n; 
    if(isSquare(n)){ 
        cout<<n<<" is a Square number"<<endl; 
    }else{ 
        cout<<n<<" is not a Square number"<<endl; 
    }
    return 0;
}


33. (1)处应填( )

A. 1
B. 2
C. 3
D. 4

34. (2)处应填( )

A. (int) floor(sqrt(num)-1)
B. (int)floor(sqrt(num))
C. floor(sqrt(num/2))-1
D. floor(sqrt(num/2))

35. (3)处应填( )

A. num=2*i
B. num==2*i
C. num=i*i
D. num==i*i

36. (4)处应填( )

A. num=2*i
B. num==2*i
C. true
D. false

37. (5)处应填( )

A. num=2*i
B. num!=2*i
C. true
D. false


(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
(1)只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
(2)每次只能移动一个圆盘。
(3)小圆盘必须始终在大圆盘之上。
试补全程序。
#include <bits/stdc++.h> 
using namespace std; 

void move(char src, char tgt) { 
    cout << "从柱子" << src << "挪到柱子上" << tgt << endl; 
} 
void dfs(int i, char src, char tmp, char tgt) { 
    if(i == (1) ) { 
        move( (2) ); 
        return; 
    } 
    dfs(i-1, (3) ); 
    move(src, tgt); 
    dfs( (5) , (4) ); 
} 

int main() { 
    int n; 
    cin >> n; 
    dfs(n, 'A', 'B', 'C'); 
}


38. (1)处应填( )

A. 0
B. 1
C. 2
D. 3

39. (2)处应填( )

A. src,tmp
B. src,tgt
C. tmp,tgt
D. tgt,tmp

40. (3)处应填( )

A. src,tmp,tgt
B. src,tgt,tmp
C. tgt,tmp,src
D. tgt,src,tmp

41. (4)处应填( )

A. src,tmp,tgt
B. tmp,src,tgt
C. src,tgt,tmp
D. tgt,src,tmp

42. (5)处应填( )

A. 0
B. 1
C. i-1
D. i

Source

初赛 普及组