解析--信奥csp-j初赛真题2024

第 1 题

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

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

本题共 2 分

第 2 题

计算 (148−10102)×D16−11012(148​−10102​)×D16​−11012​ 的结果,并选择答案的十进制值:( )

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


本题共 2 分

第 3 题

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

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


本题共 2 分

第 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


本题共 2 分

第 5 题

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

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


本题共 2 分

第 6 题

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

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


本题共 2 分

第 7 题

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

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


本题共 2 分

第 8 题

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

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


本题共 2 分

第 9 题

假设有序表中有 10001000 个元素,则用二分法查找元素 XX 最多需要比较( )次。

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


本题共 2 分

第 10 题

下面的哪一个不是操作系统名字?( )

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


本题共 2 分

第 11 题

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

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


本题共 2 分

第 12 题

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

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


本题共 2 分

第 13 题

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

 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


本题共 2 分

第 14 题

有 55 个男生和 33 个女生站成一排,规定 33 个女生必须相邻。问有多少种不同的排列方式?( )

 A. 43204320 种
 B. 50405040 种
 C. 36003600 种
 D. 28802880 种


本题共 2 分

第 15 题

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

 A. 直接执行源代码

 B. 将源代码转换为机器代码

 C. 进行代码调试

 D. 管理程序运行时的内存


本题共 2 分

第 16 题

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 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 <= n; i++) {
        if (isPrime(i)) {
            sum += i;
        }
    }
    return sum;
}

int main() {
    int x;
    cin >> x;
    cout << countPrimes(x) << " " << sumPrimes(x) << endl;
    return 0;
}

判断题

  1. 当输入为 10 时,程序的第一个输出为 4 ,第二个输出为 17。()
  2. 若将 isPrime(i) 函数中的条件改为 i<=n/2,输入 2020 时, countPrimes(20) 的输出将变为 66。()
  3. sumPrimes 函数计算的是从 22 到 nn 之间的所有素数之和。()

单选题

  1. 当输入为 50 时,sumPrimes(50) 的输出为( )。
  2. 如果将 for (int i = 2; i * i <= n; i++) 改为 for (int i = 2; i <= n; i++),输入 1010 时,程序的输出( )。
  1.  A. 正确
     B. 错误
  2.  A. 正确
     B. 错误
  3. A. 正确
     B. 错误
  4.  A. 1060
     B. 328
     C. 381
     D. 275
  5.  A. 将不能正确计算 1010 以内素数个数及其和
     B. 仍然输出 44 和 1717
     C. 输出 33 和 1010
     D. 输出结果不变,但运行时间更短


本题共 10.5 分

第 17 题

第 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;
}

判断题

  1. 当输入的 cost 数组为 {10,15,20}{10,15,20} 时,程序的输出为 1515。( )
  2. 如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。( )
  3. 程序总是输出 cost 数组中最小的元素。( )

单选题

  1. 当输入的 cost 数组为 {1,100,1,1,1,100,1,1,100,1}{1,100,1,1,1,100,1,1,100,1} 时,程序的输出为( )。
  2. 如果输入的 cost 数组为 {10,15,30,5,5,10,20}{10,15,30,5,5,10,20},程序的输出为( )。
  3. 若将代码中的 min(dp[i-1], dp[i-2]) + cost[i-1] 修改为 dp[i-1] + cost[i-2],输入 cost 数组为 {5,10,15}{5,10,15} 时,程序的输出为( )。
  1.  A. 正确
     B. 错误
  2.  A. 正确
     B. 错误
  3.  A. 正确
     B. 错误
  4.  A. 6
     B. 7
     C. 8
     D. 9
  5.  A. 25
     B. 30
     C. 35
     D. 40
  6.  A. 10
     B. 15
     C. 20
     D. 25


本题共 13.5 分

第 18 题

第 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;
}

判断题

  1. 当输入为 2 3 时,customFunction(2, 3) 的返回值为 6464。( )
  2. (本题为错题,请选择【正确】和【错误】获得对应分数)当 bb 为负数时,customFunction(a, b) 会陷入无限递归。( )
  3. (本题为错题,请选择【正确】和【错误】获得对应分数)当 bb 的值越大,程序的运行时间越长。( )

单选题

  1. 当输入为 5 4 时,customFunction(5, 4) 的返回值为( )。
  2. 如果输入 x=3 和 y=3,则程序的最终输出为( )。
  3. (4 分)若将 customFunction 函数改为 return a + customFunction(a-1, b-1);,并输入 3 3,则程序的最终输出为( )。
  1.  A. 正确
     B. 错误
  2.  A. 正确
     B. 错误
  3.  A. 正确
     B. 错误
  4.  A. 5
     B. 25
     C. 250
     D. 625
  5.  A. 27
     B. 81
     C. 144
     D. 256
  6.  A. 9
     B. 16
     C. 25
     D. 36


本题共 14.5 分

第 19 题

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

第 1 题

(判断平方数) 问题:给定一个正整数 nn,希望判断这个数是否为完全平方数,即存在一个正整数 xx,使得 xx 的平方为 nn。

试补全程序。

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

bool isSquare(int num) {
    int i = ___①___;
    int bound = ___②___;
    for (; i <= bound; ++i) {
        if (___③___) {
            return ___④___;
        }
    }
    return___⑤___;
}

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;
}
  1. ① 处应填( )
    A. 1
    B. 2
    C. 3
    D. 4
  2. ② 处应填( )
    A. (int)floor(sqrt(num))-1
    B. (int)floor(sqrt(num))
    C. floor(sqrt(num/2))-1
    D. floor(sqrt(num/2))
  3. ③ 处应填( )
    A. num = 2 * i
    B. num == 2 * i
    C. num = i * i
    D. num == i * i
  4. ④ 处应填( )(本题有多个可能选项)
    A. num = 2 * i
    B. num == 2 * i
    C. true
    D. false
  5. ⑤ 处应填( )
    A. num = i * i
    B. num != i * i
    C. true
    D. false
  1.  A. 1
     B. 2
     C. 3
     D. 4
  2.  A. (int)floor(sqrt(num))-1
     B. (int)floor(sqrt(num))
     C. floor(sqrt(num/2))-1
     D. floor(sqrt(num/2))
  3.  A. num = 2 * i
     B. num == 2 * i
     C. num = i * i
     D. num == i * i
  4.  A. num = 2 * i
     B. num == 2 * i
     C. true
     D. false
  5.  A. num = i * i
     B. num != i * i
     C. true
     D. false


本题共 15 分

第 20 题

第 2 题

(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:

  1. 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
  2. 每次只能移动一个圆盘。
  3. 小圆盘必须始终在大圆盘之上。

试补全程序。

#include <iostream>
#include <vector>
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 == ___①___) {
        move(___②___;
        return;
    }
    dfs(i - 1, ___③___);
    move(src, tgt);
    dfs(___⑤___, ___④___);
}

int main() {
    int n;
    cin >> n;
    dfs(n, 'A', 'B', 'C');
}
  1. ① 处应填( )
    A. 0
    B. 1
    C. 2
    D. 3
  2. ② 处应填( )
    A. src, tmp
    B. src, tgt
    C. tmp, tgt
    D. tgt, tmp
  3. ③ 处应填( )
    A. src, tmp, tgt
    B. src, tgt, tmp
    C. tgt, tmp, src
    D. tgt, src, tmp
  4. ④ 处应填( )
    A. src, tmp, tgt
    B. tmp, src, tgt
    C. src, tgt, tmp
    D. tgt, src, tmp
  5. ⑤ 处应填( )
    A. 0
    B. 1
    C. i - 1
    D. i
  1.  A. 0
     B. 1
     C. 2
     D. 3
  2.  A. src, tmp
     B. src, tgt
     C. tmp, tgt
     D. tgt, tmp
  3.  A. src, tmp, tgt
     B. src, tgt, tmp
     C. tgt, tmp, src
     D. tgt, src, tmp
  4.  A. src, tmp, tgt
     B. tmp, src, tgt
     C. src, tgt, tmp
     D. tgt, src, tmp
  5.  A. 0
     B. 1
     C. i - 1
     D. i


本题共 15 分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值