一、单项选择题 (共15题,每题2分,共计30分) 以下哪个不是计算机的输入设备?

A. 键盘

B. 打印机

C. 鼠标

D. 扫描仪

一个完整的计算机系统应包括( )。

A. 主机和外部设备

B. 硬件系统和软件系统

C. 操作系统和应用程序

D. 运算器、控制器和存储器

在C++语言中,表达式 (12 | 5) & 10 的值是( )。

A. 4

B. 8

C. 12

D. 15

有6个元素的有序数列 [3, 7, 9, 11, 23, 45],用二分查找法查找元素11,需要比较( )次。

A. 1

B. 2

C. 3

D. 4

一棵完全二叉树有2025个结点,则它的叶子结点数是( )。

A. 1012

B. 1013

C. 1012 或 1013

D. 1024

以下关于时间复杂度的说法错误的是( )。

A. 冒泡排序的平均时间复杂度是 O(n²)

B. 快速排序在最坏情况下的时间复杂度是 O(n log n)

C. 二分查找的时间复杂度是 O(log n)

D. 遍历一个二维数组的时间复杂度是 O(n²)

栈的特点是“后进先出”(LIFO)。现有序列 1, 2, 3 依次入栈,则不可能的出栈序列是( )。

A. 3, 2, 1

B. 2, 1, 3

C. 1, 3, 2

D. 3, 1, 2

在C++中,定义 int a[10]; 则数组 a 的下标范围是( )。

A. a[1] 到 a[10]

B. a[0] 到 a[9]

C. a[0] 到 a[10]

D. a[1] 到 a[9]

十进制数 17.625 对应的二进制数是( )。

A. 10001.101

B. 10001.110

C. 10010.101

D. 10010.110

以下代码片段的输出结果是( )。

int cnt = 0;
for (int i = 1; i <= 10; i++) {
    for (int j = 1; j <= i; j++) {
        if (i * j > 15) break;
        cnt++;
    }
}
cout << cnt;

A. 25

B. 30

C. 35

D. 40

将 7, 2, 5, 4, 1, 9 六个数字依次插入到一个最初为空的最大堆(大顶堆)中,最终堆的层序遍历结果是( )。

A. 9, 7, 5, 2, 4, 1

B. 9, 7, 5, 2, 1, 4

C. 9, 5, 7, 4, 2, 1

D. 9, 7, 4, 5, 2, 1

在C++中,执行以下语句后,变量 x 的值是( )。

int x = 10;
int &y = x;
y = 20;
int z = 30;
y = z;

A. 10

B. 20

C. 30

D. 40

定义 char s[] = "CSP-J";,则 sizeof(s) 和 strlen(s) 的值分别是( )。

A. 5, 5

B. 6, 5

C. 5, 6

D. 6, 6

一个算法的时间复杂度表示为 T(n) = 5T(n/2) + O(n),则该算法的复杂度为( )。

A. O(n log n)

B. O(n²)

C. O(n³)

D. O(n^{log₂5})

有 4 个砝码,重量分别为 1g, 3g, 5g, 7g。利用天平,可以称出( )种不同的重量(要求砝码只能放在天平的一边)。

A. 12

B. 13

C. 14

D. 15

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

(一)

#include <iostream>
using namespace std;

int main() {
    string s;
    cin >> s;
    int n = s.length();
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {
            ans++;
        }
    }
    cout << ans << endl;
    return 0;
}

判断题

该程序的功能是统计输入字符串中大写元音字母的个数。( )

若输入字符串为 "Hello World!",则程序输出为 3。( )

单选题 3. 该程序的时间复杂度是( )。

A. O(n)

B. O(n²)

C. O(n log n)

D. O(1)

  1. 若想要程序统计非元音字母(辅音字母和其他字符)的个数,应如何修改?( )

A. 将 ans++ 改为 ans--

B. 将 if 条件中的 == 改为 !=

C. 将 if 条件中的 || 改为 &&

D. 将 ans 初始值改为 n,并将 ans++ 改为 ans--

(二)

#include <iostream>
using namespace std;

int fun(int n) {
    if (n <= 1) return n;
    return fun(n - 1) + fun(n - 2);
}

int main() {
    int n;
    cin >> n;
    cout << fun(n) << endl;
    return 0;
}

判断题

该程序使用了贪心算法来求解问题。( )

当输入 n 的值较大时(如 n=50),程序可能在短时间内无法完成计算。( )

单选题

  1. 该程序实现的功能是计算( )。

A. n 的阶乘

B. 斐波那契数列的第 n 项(F(0)=0, F(1)=1)

C. 斐波那契数列的第 n 项(F(1)=1, F(2)=1)

D. 从 1 到 n 的累加和

  1. 该程序的时间复杂度是( )。

A. O(n)

B. O(2^n)

C. O(n²)

D. O(log n)

(三)

#include <iostream>
using namespace std;

const int MAXN = 1005;
int a[MAXN];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    
    for (int i = 0; i < n - 1; i++) {
        int min_idx = i;
        for (int j = i + 1; j < n; j++) {
            if (a[j] < a[min_idx]) {
                min_idx = j;
            }
        }
        swap(a[i], a[min_idx]);
    }
    
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    return 0;
}

判断题

该程序实现了一种稳定的排序算法。( )

无论输入数据如何,程序中的 swap 操作总会执行 exactly n-1 次。( )

单选题

  1. 该程序使用的排序算法是( )。

A. 冒泡排序

B. 插入排序

C. 选择排序

D. 快速排序

  1. 该算法的时间复杂度是( )。

A. 最好、最坏和平均情况下都是 O(n log n)

B. 最好情况下是 O(n),最坏情况下是 O(n²)

C. 最好、最坏和平均情况下都是 O(n²)

D. 最好情况下是 O(n log n),最坏情况下是 O(n²)

三、完善程序 (共2题,每题15分,共计30分)

(一)(数字反转) 题目描述:输入一个不小于 100 且小于 1000 的正整数,将这个数反转后输出。

输入样例:123 输出样例:321

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int a = n % 10;   // 获取个位数
    int b = ①;        // 获取十位数
    int c = n / 100;  // 获取百位数
    int reversed = ②;
    cout << reversed << endl;
    return 0;
}

①处应填( )

A. n % 100

B. (n / 10) % 10

C. n / 10

D. (n % 100) / 10

②处应填( ) A. a + b + c

B. a * 100 + b * 10 + c

C. c * 100 + b * 10 + a

D. a * 100 + c * 10 + b

(二)(最大公约数与最小公倍数) 题目描述:输入两个正整数 a 和 b,求它们的最大公约数(GCD)和最小公倍数(LCM)。 输入样例:6 8 输出样例:GCD=2 LCM=24 方法提示:使用辗转相除法(欧几里得算法)求最大公约数。最小公倍数 = a * b / 最大公约数。

#include <iostream>
using namespace std;

// 使用辗转相除法计算最大公约数
int gcd(int x, int y) {
    int r;
    while (y != 0) {
        ①;
        x = y;
        y = r;
    }
    return x;
}

// 计算最小公倍数
int lcm(int x, int y) {
    return ②;
}

int main() {
    int a, b;
    cin >> a >> b;
    int g = gcd(a, b);
    int l = lcm(a, b);
    cout << "GCD=" << g << " LCM=" << l << endl;
    return 0;
}

①处应填( )

A. r = x % y

B. r = x / y

C. r = x - y

D. r = x + y

②处应填( ) A. x * y / g

B. x * y / gcd(x, y)

C. x * y

D. (x * y) / g (注意:此选项中的 g 是全局变量吗?函数内无法直接使用 main 中的 g)

正确答案应为 x * y / gcd(x, y),但选项B和D表述不清。通常这里会调用 gcd 函数。

我们修改一下选项,使其更清晰:

A. x * y

B. x / y

C. (x * y) / gcd(x, y)

D. x + y

(为了逻辑严谨,我们修改第4题的选项)

(接上题)②处应填( ) A. x * y

B. x / y

C. (x * y) / gcd(x, y)

D. x + y

0 条评论

目前还没有评论...