#ACSP1013. cspj-模拟题13

cspj-模拟题13

一、单项选择题

  1. 计算机如果缺少({{ select(1) }}),将无法正常启动。
  • CPU
  • 键盘
  • 硬盘
  • 鼠标
  1. 下列表示数据的选项中,({{ select(2) }})表示的数据最大。
  • 36000KB
  • 33MB
  • 0.03GB
  • 36500000B
  1. 如果一棵二叉树只有根节点,那么这棵二叉树的高度为1。则一棵高度为3的二叉树有({{ select(3) }})种不同的形态。
  • 16
  • 19
  • 21
  • 25
  1. 对于入栈顺序为a, b, c, d, e的序列,下列({{ select(4) }})不是合法的出栈序列。
  • a, b, c, d, e
  • e, d, c, b, a
  • a, c, b, d, e
  • e, d, b, c, a
  1. 二进制数11001.1对应的十进制数是({{ select(5) }})。
  • 23.2
  • 25.5
  • 36.2
  • 49.5
  1. 若根节点的深度记为1,则一棵恰有2023个叶节点的二叉树的深度最少是({{ select(6) }})。
  • 10
  • 11
  • 12
  • 13
  1. 一个正整数在八进制下有3位,则它在二进制下不可能有({{ select(7) }})位。
  • 297
  • 298
  • 299
  • 300
  1. 2000以内,与500互质的正整数有({{ select(8) }})个。
  • 500
  • 800
  • 1000
  • 1200
  1. 下面的lowbit(x)函数返回整数x在二进制表示下最低一位1对应的数字,比如:lowbit(5)=1, lowbit(12)=4
int lowbit(int x) {
    return __________;
}

则可填入空格内的正确语句是({{ select(9) }})。

  • x & -x
  • x >> 1
  • x | x - 1
  • x ^ 1

10.一个人站在坐标(0, 0)处,面朝x轴正方向。第一轮,他向前走1单位距离,然后右转;第二轮,他向前走2单位距离,然后右转;第三轮,他向前走3单位距离,然后右转……他一直这么走下去。则第2023轮后,他的坐标是({{ select(10) }})。

  • (-1012, -1012)
  • (-1012, 1012)
  • (2022, 1012)
  • (2022, -1012)

11.从一个5 × 5的棋盘(不可旋转)中选取不在同一行也不在同一列上的两个方格,共有({{ select(11) }})种方法。

  • 50
  • 100
  • 125
  • 200

12.设int类型变量x和y均已赋值,且均为正整数,则以下语句中不能表示x除以y向上取整的是({{ select(12) }})。

  • (x + y - 1)/y
  • (int)(x + 0.5)/y
  • x/y + x%y?1 : 0
  • (x - 1)/y + 1

13.4张椅子放成一排,3人就座,其中恰有连续三个空位的做法有({{ select(13) }})种。

  • 360
  • 480
  • 720
  • 1220

14.一棵二叉树中序遍历为DGBAECHF,后序遍历为GDBEHFCA,则前序遍历为({{ select(14) }})。

  • ABCDGFHE
  • ABDGCEFH
  • ACBGDHEF
  • ACEFHBGD

15.以下哪个奖项是计算机科学领域的最高奖?({{ select(15) }})

  • 冯·诺依曼奖
  • 菲尔兹奖
  • 图灵奖
  • 香农奖

二、阅读程序

第一小题

#include <iostream>
using namespace std;
char s[100];
int cnt[26];
int main() {
    cin >> s;
    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] >= 'a' && s[i] <= 'z')
            s[i] -= 'a' - 'A';
        cnt[s[i]-'A']++;
    }
    for (int i = 0, j = 0; s[i] != '\0' && j < 26; i++) {
        while (!cnt[j])
            j++;
        s[i] = 'a' + j;
        cnt[j]--;
    }
    cout << s << endl;
    return 0;
}

16.输入的字符串应当只由大写英文字母组成,否则会发生数组越界。({{ select(16) }})

  • ×

17.输入的字符串长度与输出的字符串长度相同。({{ select(17) }})

  • ×

18.当输入为rUiBA时,输出为abiru。({{ select(18) }})

  • ×

19.当输入为niceToMeetYou时,输出为cieeemnoottyu。({{ select(19) }})

  • ×

20.若输入的字符串不是空串,则({{ select(20) }})

  • 输出的字符串一定和原字符串一致
  • 输出的字符串有可能和原字符串一致
  • 输出的字符串不可能和原字符串一致
  • 输出的字符串有可能和原字符串长度不同

21.当输入为codeInRUIBA时,输出为({{ select(21) }})。

  • codeinruiba
  • abcdenEeIHT
  • abcdeiinoru
  • oaadcneeiht

第二小题

#include <iostream>
using namespace std;
int a[] = {1,3,5,7,9,13,18,22,37,45,51,62,77,89,93}, x;
int main() {
    cin >> x;
    int left = 0, right = 15, mid, p = -1, count = 0;
    while (left < right) {
        mid = (left + right - 1) / 2;
        count++;
        if (a[mid] == x) {
            p = mid;
            break;
        }
        else if (a[mid] < x)
            left = mid + 1;
        else
            right = mid;
    }
    cout << p << endl;
    cout << count << endl;
    return 0;
}

22.输入的x不能大于15,否则会发生数组越界。({{ select(22) }})

  • ×

23.输出的第一行不会大于14。({{ select(23) }})

  • ×

24.输出的第二行不会大于5。({{ select(24) }})

  • ×

25.当输入为12时,输出的第一行为({{ select(25) }})。

  • -1
  • 1
  • 2
  • 3

26.当输入为37时,输出的第一行为({{ select(26) }})。

  • -1
  • 1
  • 2
  • 3

27.当输入为37时,输出的第二行为({{ select(27) }})。

  • 1
  • 2
  • 3
  • 4

第三小题

#include <iostream>
using namespace std;
int c[100], n, s, cnt, ans;
void calln(int x) {
    while (x) {
        n++;
        x >>= 1;
    }
}
int bitcount(int x) {
    int cnt = 0;
    while (x) {
        cnt += x & 1;
        x >>= 1;
    }
    return cnt;
}
int main() {
    cin >> s;
    calln(s);
    for (int i = s; i; i = s & (i-1)) {
        cnt++;
        c[bitcount(i)] += i;
    }
    for (int i = 1; i <= n; i++)
        ans = max(ans, c[i]);
    cout << cnt << endl;
    cout << ans << endl;
    return 0;
}

假设输入的s为正整数且不超过100,完成下面的判断题和单选题:

28.输出的第一行不会超过输入的s。({{ select(28) }})

  • ×

29.函数bitcount(x)用于计算x对应的二进制整数的位数。({{ select(29) }})

  • ×

30.输入的s不应大于100,否则会发生数组越界。({{ select(30) }})

  • ×

31.当输入的s为23时,输出的第一行整数为({{ select(31) }})。

  • 3
  • 7
  • 11
  • 16

32.当输入的s为127时,输出的第二行整数为({{ select(32) }})。

  • 1980
  • 2540
  • 2870
  • 3200

33.当输入的s为11时,输出的第二行整数为({{ select(33) }})。

  • 1980
  • 2540
  • 2870
  • 3200

三、完善程序

第一小题 (下一天问题)设计一个算法,这个算法获取今天的日期,计算并返回下一天的日期。我们先设计一个函数f(y, m),它接收的两个参数y和m分别表示年份和月份,f(y, m)会返回y年m月的天数。在此基础上,计算并输出y年m月d日的下一天的日期。题目保证输入的日期一定是合法的,试补全下方模拟程序。

#include <iostream>
using namespace std;
int f(int y, int m) {
    // 此处为判断并返回y年m月的天数的代码,省略
}
int main() {
    int y, m, d;
    cin >> y >> m >> d;
    if ( ___(1)___ ){
        cout << "下一天是" << y << "年" << m << "月" << d+1 << "日" << endl;
    }
    else if ( ___(2)___ ){
        cout << "下一天是" << y << "年" << m+1 << "月" << 1 << "日" << endl;
    }
    else{
        cout << "下一天是" << ___(3)___ << "年" << ___(4)___ << "月" << ___(5)___ << "日" << endl;
    }
    return 0;
}

34._ (1) _ 处应填({{ select(34) }})

  • d = 1
  • d < f(y, m)
  • d == f(n, m)
  • d != 1

35._ (2) _ 处应填({{ select(35) }})

  • m == 1
  • m > 1
  • m < 12
  • m == 12

36._ (3) _ 处应填({{ select(36) }})

  • y
  • y - 1
  • y + 1
  • y/4 * 4

37._ (4) _ 处应填({{ select(37) }})

  • 1
  • m - 1
  • m
  • m + 1

38._ (5) _ 处应填({{ select(38) }})

  • 1
  • d - 1
  • d
  • d + 1

第二小题

(第k大的数)给定一个大小为n的数列,寻找数列中第k大的值。下方的代码基于快速排序的思想,使用分治策略解决这个问题。试补全分治程序。

#include <iostream>
using namespace std;
int n, k, a[100001];
int kth_largest(int l, int r, int k) {
    int i = l, j = r, t = a[l];
    while (i < j) {
        while (i < j && a[j] <= t)
            ___ (1) ___ ;
        a[i] = a[j];
        while (i < j && a[i] >= t)
            i++;
        ___ (2) ___
    }
    a[i] = t;
    if ( ___ (3) ___ )
        return a[i];
    if ( ___ (4) ___ )
        return kth_largest(l, i - 1, k);
    return kth_largest(i+1, r, ___ (5) ___ );
}
int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    cout << kth_largest(1, n, k) << endl;
    return 0;
}

39._ (1) _ 处应填({{ select(39) }})

  • i--
  • i++
  • j--
  • j++

40._ (2) _ 处应填({{ select(40) }})

  • a[i] = a[j]
  • a[j] = a[i]
  • a[i] = t
  • a[j] = t

41._ (3) _ 处应填({{ select(41) }})

  • i - l < k
  • i - l > k
  • i - l == k
  • i - l + 1 == k

42._ (4) _ 处应填({{ select(42) }})

  • i - l == k
  • i - l < k
  • i - l + 1 > k
  • i - l - 1 < k

43._ (5) _ 处应填({{ select(43) }})

  • k
  • k - l + i
  • k + l - i - 1
  • l