#P1396. CSP-J1 Day1-Day3 阶段模拟卷(第一套)

CSP-J1 Day1-Day3 阶段模拟卷(第一套)

CSP-J1 Day1-Day3 阶段模拟卷(第一套)

考查范围:Day1~Day3;建议考试时间:2 小时;满分:100 分。

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

第 1 题

冯·诺依曼计算机的中央处理器(CPU)主要由哪两部分组成?( {{ select(1) }})

  • 运算器和控制器
  • 存储器和输入设备
  • 输入设备和输出设备
  • 硬盘和内存

第 2 题

按照竞赛中常用的二进制换算,1 MiB1\text{ MiB} 等于多少 $ ext{KiB}$?( {{ select(2) }})

  • 10001000
  • 10241024
  • 20482048
  • 40964096

第 3 题

一个 8 位无符号整数能够表示的最大值是( {{ select(3) }})。

  • 127127
  • 128128
  • 255255
  • 256256

第 4 题

一个 8 位二进制补码有符号整数的表示范围是( {{ select(4) }})。

  • [127,127][-127,127]
  • [128,127][-128,127]
  • [128,128][-128,128]
  • [0,255][0,255]

第 5 题

二进制数 (101101)2(101101)_2 对应的十进制数是( {{ select(5) }})。

  • 4343
  • 4545
  • 5353
  • 6161

第 6 题

十六进制数 (7B)16(7B)_{16} 对应的十进制数是( {{ select(6) }})。

  • 113113
  • 119119
  • 123123
  • 127127

第 7 题

十进制整数 18-18 的 8 位补码是( {{ select(7) }})。

  • 00010010
  • 10010010
  • 11101101
  • 11101110

第 8 题

已知 ASCII 编码中大写英文字母连续排列,执行以下代码后输出的是( )。

char c = 'A';
cout << char(c + 5);

{{ select(8) }}

  • E
  • F
  • G
  • 70

第 9 题

执行 int x = 44; cout << (x & (x - 1)); 后,输出结果是( {{ select(9) }})。

  • 4242
  • 4343
  • 4040
  • 3232

第 10 题

表达式 13 ^ 7 的值是( {{ select(10) }})。

  • 1010
  • 1111
  • 1212
  • 1414

第 11 题

使用公式 g = b ^ (b >> 1) 将二进制数 1011 转成格雷码,结果是( {{ select(11) }})。

  • 1001
  • 1010
  • 1101
  • 1110

第 12 题

以下程序段的时间复杂度是( )。

for (int i = 1; i <= n; i *= 2)
    cout << i << ' ';

{{ select(12) }}

  • O(1)O(1)
  • O(logn)O(\log n)
  • O(n)O(n)
  • O(n2)O(n^2)

第 13 题

执行以下代码后输出的是( )。

int x = 5;
if (x > 0)
    if (x % 2 == 0)
        cout << "A";
    else
        cout << "B";

{{ select(13) }}

  • 不输出
  • B
  • A
  • 编译错误

第 14 题

定义 int a[5]; 后,数组 a 的合法下标范围是( {{ select(14) }})。

  • 151\sim5
  • 050\sim5
  • 040\sim4
  • 141\sim4

第 15 题

执行以下程序后,x 和 y 的值分别是( )。

void change(int &a, int &b) {
    a = a + b;
    b = a - b;
    a = a - b;
}

int main() {
    int x = 3, y = 8;
    change(x, y);
    cout << x << ' ' << y;
}

{{ select(15) }}

  • 8,38,3
  • 3,83,8
  • 11,511,5
  • 8,88,8

二、阅读程序(判断题正确填 A,错误填 B;共 40 分)

第 16 题

阅读下面的程序,回答第 16~21 题。

#include <iostream>
using namespace std;

int main() {
    unsigned int x;
    cin >> x;
    int cnt = 0;
    while (x) {
        x &= x - 1;
        cnt++;
    }
    cout << cnt << endl;
    return 0;
}

判断题

16.(1 分)当输入为 0 时,while 循环一次也不会执行。( {{ input(16) }})

17.(1.5 分)循环体中的 x &= x - 1 每执行一次,会消去 x 的二进制表示中最低位的一个 1。( {{ input(17) }})

18.(1.5 分)程序输出的是原输入的二进制表示中 1 的个数。( {{ input(18) }})

单选题

  1. 当输入为 45 时,程序输出为( {{ select(19) }})。
  • 22
  • 33
  • 55
  • 44
  1. 当输入为 64 时,程序输出为( {{ select(20) }})。
  • 11
  • 22
  • 66
  • 6464
  1. 若输入正整数 x 的二进制位数随 x 增长,则该程序最坏情况下的时间复杂度是( {{ select(21) }})。
  • O(1)O(1)
  • O(logx)O(\log x)
  • O(x)O(x)
  • O(xlogx)O(x\log x)

第 17 题

阅读下面的程序,回答第 22~27 题。保证输入字符串中至少有一个小写英文字母。

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

int main() {
    string s;
    cin >> s;
    int cnt[26] = {};
    for (char c : s) {
        if (c >= 'a' && c <= 'z')
            cnt[c - 'a']++;
    }
    int best = 0;
    for (int i = 1; i < 26; i++) {
        if (cnt[i] > cnt[best])
            best = i;
    }
    cout << char('a' + best) << ' ' << cnt[best] << endl;
    return 0;
}

判断题

22.(1.5 分)输入 abacaba 时,程序输出 a 4。( {{ input(22) }})

23.(1.5 分)当出现次数最多的小写字母不止一个时,程序输出字典序最小的那个。( {{ input(23) }})

24.(1.5 分)输入中的数字字符不会被用作数组 cnt 的下标。( {{ input(24) }})

单选题

  1. 输入 bbaacc 时,程序输出( {{ select(25) }})。
  • a 2
  • b 2
  • c 2
  • a 6
  1. 对于输入 bbaacc,若把 cnt[i] > cnt[best] 改为 cnt[i] >= cnt[best],程序将输出( {{ select(26) }})。
  • a 2
  • b 2
  • c 2
  • z 0
  1. 设输入字符串长度为 n,该程序的时间复杂度是( {{ select(27) }})。
  • O(1)O(1)
  • O(n)O(n)
  • O(nlogn)O(n\log n)
  • O(n2)O(n^2)

第 18 题

阅读下面的程序,回答第 28~33 题。保证输入 n 为正整数。

#include <iostream>
using namespace std;

int f(int n) {
    if (n < 10) return n;
    return f(n / 10) + n % 10;
}

void g(int n) {
    if (n == 0) return;
    cout << n % 10;
    g(n / 10);
}

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

判断题

28.(1.5 分)函数 f 返回正整数 n 的各位数字之和。( {{ input(28) }})

29.(1.5 分)函数 g 按照从个位到最高位的顺序输出 n 的各位数字。( {{ input(29) }})

30.(1.5 分)如果删除函数 g 中的 if (n == 0) return;,对于任意正整数输入,递归都无法正常结束。( {{ input(30) }})

单选题

  1. 当输入为 1203 时,程序输出为( {{ select(31) }})。
  • 第一行 6,第二行 1203
  • 第一行 5,第二行 3021
  • 第一行 6,第二行 3021
  • 第一行 6,第二行 321
  1. 函数 f 的递归深度与 n 的十进制位数同阶,其时间复杂度是( {{ select(32) }})。
  • O(1)O(1)
  • O(logn)O(\log n)
  • O(n)O(n)
  • O(n2)O(n^2)
  1. 若将函数 g 改为先执行 g(n / 10);,再执行 cout << n % 10;,其主要作用变为( {{ select(33) }})。
  • 按原顺序输出 n 的各位数字
  • 计算 n 的各位数字之和
  • 将 n 转成二进制
  • 判断 n 是否为回文数

三、完善程序(共 10 题,每题 3 分,共 30 分)

第 19 题

(进制转换)以下函数将非负十进制整数 n 转换成 2~16 进制字符串。试补全程序。

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

string convertBase(int n, int base) {
    const string digit = "0123456789ABCDEF";
    if (__①__) return "0";
    string s = "";
    while (n > 0) {
        s += digit[__②__];
        __③__;
    }
    __④__;
    return __⑤__;
}
  1. ①处应填( {{ select(34) }})。
  • n < 0
  • base == 0
  • n == 0
  • s.empty()
  1. ②处应填( {{ select(35) }})。
  • n / base
  • n % base
  • base % n
  • n - base
  1. ③处应填( {{ select(36) }})。
  • n += base
  • n %= base
  • base /= n
  • n /= base
  1. ④处应填( {{ select(37) }})。
  • reverse(s.begin(), s.end())
  • sort(s.begin(), s.end())
  • s.clear()
  • s += '0'
  1. ⑤处应填( {{ select(38) }})。
  • digit
  • n
  • s
  • base

第 20 题

(回文与数字字符统计)以下程序判断字符串是否为回文串,并统计其中数字字符的个数。试补全程序。

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

bool palindrome(__①__) {
    int l = 0;
    int r = __②__;
    while (l < r) {
        if (__③__) return false;
        l++;
        __④__;
    }
    return true;
}

int main() {
    string s;
    cin >> s;
    int digitCount = 0;
    for (char c : s) {
        if (__⑤__) digitCount++;
    }
    cout << (palindrome(s) ? "YES" : "NO") << endl;
    cout << digitCount << endl;
    return 0;
}
  1. ①处应填( {{ select(39) }})。
  • string s
  • const string &s
  • int &s
  • char s
  1. ②处应填( {{ select(40) }})。
  • 0
  • s.length()
  • s.length() - 1
  • s.length() + 1
  1. ③处应填( {{ select(41) }})。
  • s[l] != s[r]
  • s[l] == s[r]
  • l == r
  • s.empty()
  1. ④处应填( {{ select(42) }})。
  • r++
  • r = 0
  • l--
  • r--
  1. ⑤处应填( {{ select(43) }})。
  • c >= 'a' && c <= 'z'
  • c >= '0' && c <= '9'
  • c == 0
  • c != '0'