#ACSP1013. cspj-模拟题13
cspj-模拟题13
一、单项选择题
- 计算机如果缺少({{ select(1) }}),将无法正常启动。
- CPU
- 键盘
- 硬盘
- 鼠标
- 下列表示数据的选项中,({{ select(2) }})表示的数据最大。
- 36000KB
- 33MB
- 0.03GB
- 36500000B
- 如果一棵二叉树只有根节点,那么这棵二叉树的高度为1。则一棵高度为3的二叉树有({{ select(3) }})种不同的形态。
- 16
- 19
- 21
- 25
- 对于入栈顺序为
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
- 二进制数
11001.1
对应的十进制数是({{ select(5) }})。
- 23.2
- 25.5
- 36.2
- 49.5
- 若根节点的深度记为1,则一棵恰有2023个叶节点的二叉树的深度最少是({{ select(6) }})。
- 10
- 11
- 12
- 13
- 一个正整数在八进制下有3位,则它在二进制下不可能有({{ select(7) }})位。
- 297
- 298
- 299
- 300
- 2000以内,与500互质的正整数有({{ select(8) }})个。
- 500
- 800
- 1000
- 1200
- 下面的
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