CCF编程能力等级认证GESP—C++3级—样题1
单选题(每题 2 分,共 30 分)
1、下列关于负数的原码、反码、补码的描述中,正确的是( )
A. 原码和反码互为按位取反(符号位除外),补码为反码加1
B. 原码和反码互为按位取反(符号位除外),补码为原码加1
C. 反码和补码互为按位取反(符号位除外),原码为反码加1
D. 补码和原码互为按位取反(符号位除外),反码为补码加1
正确答案: A
十进制数 | 5 | -5 |
---|---|---|
原码 | 00000101 | 10000101 |
反码 | 00000101 | 11111010 |
补码 | 00000101 | 11111011 |
2、一个 int 类型的值乘以 8,等价于以下哪个位运算?( )
A. 左移 3 位
B. 右移 3 位
C. 左移 8 位
D. 右移 8 位
正确答案: A
操作 | 结果 | |
---|---|---|
0101(5) | 左移1位 | 1010(10) |
0101(5) | 左移2位 | 1,0100(20) |
0101(5) | 左移3位 | 10,1000(40) |
我们可以将其转换为二进制形式来考虑。乘以8相当于将每个二进制位向左移动3位,因为8等于2的3次方(即 (2^3))。
位左移操作是将数的二进制表示向左移动指定的位数,右侧用0填充。因此,乘以8等价于将该数的二进制表示左移3位。
例如,假设我们有一个int类型的值5,其二进制表示为0000 0101(假设是8位表示,高位用0填充)。乘以8后,得到0010 1000,这正好是将原数左移3位的结果。
3、以下哪个属于 C++语言中的位运算符?( )
A. +
B. -
C. *
D. &
正确答案: D
在C++语言中,位运算符直接对整数类型的操作数进行位级别的操作。这些运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。
4、若有以下代码,则数组 arr 的长度是( )
int arr[] = {1, 2, 3, 4, 5}
A. 3
B. 4
C. 5
D. 6
正确答案: C
数组arr被初始化为包含5个整数:1, 2, 3, 4, 5。数组的长度是数组中包含的元素个数。因此,数组arr的长度是5。
5、在 C++语言中,可以定义一个一维整型数组的是( )
A. int array[5];
B. int array[];
C. int[5] array;
D. int[] array;
正确答案: A
在C++语言中,定义一维整型数组的正确语法是:数据类型 数组名[长度];
6、枚举算法的主要特点是( )
A. 以空间换时间
B. 逐个尝试所有可能的解
C. 动态规划
D. 贪心策略
正确答案: B
枚举算法的主要特点是通过逐个尝试所有可能的解来找出问题的解。这种算法通常不依赖于问题的特殊性质,而是直接穷举所有可能性。
A选项: 通常与某些优化技术相关,比如使用哈希表或查找表来加速查找,但这并不是枚举算法的主要特点。
C选项: 是一种用于解决最优化问题的算法技术,它通过将问题分解为重叠的子问题并保存子问题的解来避免重复计算。这与枚举算法不同。
D选项: 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。它也不是枚举算法的主要特点。
7、对于一个十进制数 37,以下哪个是它的二进制表示( )
A. 10101
B. 100101
C. 101001
D. 1000101
正确答案: B
被除数 | 除数 | 商 | 余数 |
---|---|---|---|
37 | 2 | 18 | 1 |
18 | 2 | 9 | 0 |
9 | 2 | 4 | 1 |
4 | 2 | 2 | 0 |
2 | 2 | 1 | 0 |
1 | 2 | 0 | 1 |
所以结果是: 1001 01,整数部分倒序
8、下列关于十六进制的描述中,正确的是( )
A. 使用 0-9 和 A-F 表示
B. 使用 0-9 和 A-E 表示
C. 使用 1-9 和 A-F 表示
D. 使用 1-9 和 A-E 表示
正确答案:A
十进制数 | 十六进制数 |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
9、下列哪个是 C++语言中用于获取字符串长度的函数( )
A. length()
B. len()
C. getLength()
D. strlen()
正确答案:A
在 C++ 中,如果要获取字符串的长度,应该使用 length() 或 size() 方法
如果要获取字符数组的长度, 则应该使用stelen(数组名),但是需要添加cstring头文件
10、通常用下列哪种方式来描述算法?
A. 汇编语言
B. 伪代码
C. SQL
D. CSS
正确答案:B
A选项:汇编语言是一种低级编程语言,主要用于与计算机硬件直接交互。它使用助记符来表示机器指令,与特定的计算机架构紧密相关。由于汇编语言关注的是机器级别的细节,它并不适合用来描述算法。算法通常关注的是解决问题的逻辑步骤,而不需要关心具体的机器指令或硬件细节。
B选项:伪代码是一种非正式的、高层次的编程语言,用于描述算法的逻辑和结构。它不是真正的编程语言,而是用于帮助人们理解和设计算法的一种工具。伪代码可以包含控制结构(如循环、条件语句)、数据结构(如数组、列表)以及变量和函数等概念,但不涉及具体的语法规则或编程细节。使用伪代码可以清晰地表达算法的核心思想,使得算法的设计和实现变得更加容易理解和交流。
C选项:SQL(结构化查询语言)是用于管理关系数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL与算法描述没有直接关系,因为它关注的是数据处理和数据库管理,而不是解决问题的逻辑步骤。
D选项:CSS(层叠样式表)是用于描述网页文档样式的语言。它控制网页元素的布局、颜色、字体等外观属性。CSS与算法描述没有直接联系,因为它关注的是网页的外观和呈现方式,而不是解决问题的逻辑或步骤。
11、如果 a 和 b 均为 int 类型的变量,下列表达式能正确判断“a 等于0 且b等于 0”的是()
A. ((~a) && (~b))
B. ((a & b) == 0)
C. ((a | b) == 0)
D. ((a ^ b) == 0)
正确答案:C
a = 1, b = 1 | a = 1, b = 0 | a = 0, b = 1 | a = 0, b = 0 | |
---|---|---|---|---|
(~a) && (~b) | 1 | 1 | 1 | 1 |
((a & b) == 0) | 0 | 1 | 1 | 1 |
(a | b) == 0 | 0 | 0 | 0 | 1 |
(a ^ b) == 0 | 1 | 0 | 0 | 1 |
当a = 1时, ~a = 1111 1110, 该补码对应的反码为1111 1101, 其对应的原码为1000 0010 (带符号整数使用补码形式表示)
12、如果 a 为 int 类型的变量,下列哪个表达式可以正确求出满足“大于等于a 且是 4 的倍数”的整数中最小的?
A. (a & (~3))
B. (a / 4 * 4)
C. ((a - 1) | 3) + 1
D. (a << 2)
正确答案:C
选项 | a = 4 | a = 5 | a = 6 | a = 7 | 备注 |
---|---|---|---|---|---|
a & (~3) | 4 | 4 | 4 | 4 | ~3 = 4 |
a / 4 * 4 | 4 | 4 | 4 | 4 | /表示整除 |
((a - 1) | 3) + 1 | 4 | 8 | 8 | 8 | 按位或|:有1则结果为1 |
(a << 2) | 16 | 20 | 24 | 28 | a * 2 2 2 ^ 2 22 |
13、下面流程图,输入 1 2 3,会输出( )
A. 无输出
B. 1
C. 2
D. 3
正确答案:B
a = 1, b = 2, c = 3
操作 | 结果 |
---|---|
min = a | min = 1 |
判断b < min | 不成立 |
判断c < min | 不成立 |
输出min | 1 |
14、在下列代码的横线处填写(),可以保证输出是“1357”,不会有多余字符。
#include <iostream>
#include <string>
using namespace std;
int main() {
char str[] = "1234567";
for (________) // 在此处填入代码
cout << str[i];
return 0;
}
A. int i = 0; i < strlen(str); i++
B. int i = 0; str[i] != '\0'; i++
C. int i = 1; i <= 7; i += 2
D. int i = 0; i <= 6; i += 2
正确答案:D
A选项:会遍历整个字符串,包括所有字符,因此会输出“1234567”。
B选项:会遍历整个字符串,直到遇到空字符’\0’为止,因此也会输出“1234567”。
C选项:从索引1开始,每次增加2,但是字符串str的最大索引是6(因为字符串是"1234567",长度为7,索引从0到6),所以这里会输出“246”。
D选项:从索引0开始,每次增加2,这样它会输出索引为0、2、4、6的字符,即“1357”。
15、在下列代码的横线处填写( ),可以使得输出是“17 11”。
#include <iostream>
using namespace std;
int main() {
int a = 11, b = 17;
a = ________; // 在此处填入代码
b = a ^ b;
a = a ^ b;
cout << a << " " << b << endl;
return 0;
}
A. a + b
B. a - b
C. a ^ b
D. a & b
正确答案:C
a = 11(1011), b = 17(10001)
过程\选项 | a + b | a - b | a ^ b | a & b |
---|---|---|---|---|
a = ___ | 28 | -6 | 26 | 1 |
b = a ^ b | 13 | -21 | 11 | 1 |
a = a ^ b | 17 | 17 | 17 | 1 |
判断题(每题 2 分,共 20 分)
1、二进制数据编码中,负数的补码是通过对原码按位取反并加1 得到的。()
正确答案:正确
在计算机中,负数的补码确实是通过对其原码(符号位不变,其余位取反)再加1得到的。这是为了在计算机中方便地进行加减运算。
2、在 C++语言中,数组的下标从 1 开始计数。( )
正确答案:错误
在C++语言中,数组的下标是从0开始计数的,而不是从1。这是C++语言数组的一个基本特性。
3、在 C++语言中,字符串是以’\0’结尾的字符数组。()
正确答案:正确
在C++中,字符串通常以字符数组的形式存储,并且以空字符’\0’作为结束符。这是C风格字符串的表示方法。
4、在 C++语言中,可以使用浮点数(如 3.0)作为数组下标。()
正确答案:错误
在C++中,数组下标必须是整数类型(如int),不能是浮点数。这是因为数组的下标是用来直接定位数组元素的,浮点数作为下标没有意义。
5、枚举算法是一种暴力求解方法,逐个尝试所有可能的解。()
正确答案:正确
枚举算法确实是一种暴力求解方法,它通过逐个尝试所有可能的解来找到问题的答案。虽然这种方法可能效率不高,但对于某些问题来说,它是可行的。
6、C++语言中数字的符号位是不参与位运算的。( )
正确答案:错误
在C++中,数字的符号位是参与位运算的。无论是正数还是负数,在进行位运算时,符号位都会被考虑进去。
7、C++语言中的数组可以根据需要自动调整大小。( )
正确答案:错误
C++中的数组是静态的,一旦定义,其大小就不能改变。如果需要动态调整大小的数组,应该使用标准模板库(STL)中的vector等容器。
8、在 C++语言中,表达式(0xff == 255)的值为 true。()
正确答案:正确
在C++中,0xff是一个十六进制数,其十进制值为255。因此,表达式(0xff == 255)的值为true。
9、如果 a 为 int 类型的变量,且表达式((a & 1) == 0)的值为true,则说明 a 是偶数。( )
正确答案:正确
表达式(a & 1)实际上是将a与二进制数1进行按位与运算。如果a是偶数,其最低位为0,那么(a & 1)的结果也为0,因此表达式((a & 1) == 0)的值为true。
10、表达式(7 >> 2)的计算结果为 1.75,且结果类型为double。()
正确答案:错误
表达式(7 >> 2)是一个右移运算,它将7的二进制表示向右移动2位。7的二进制表示是111,右移2位后变为001,即十进制数1。因此,计算结果为1,且结果类型为整型(如int),而不是double。
编程题 (每题 25 分,共 50 分)
第一题 逛商场
【问题描述】
小明是个不太有计划的孩子。这不,刚到手的零花钱,就全部拿着逛商场去了。小明的原则很简单,只要见到想买的物品而且能买得起,就一定会买下来之后才会继续往前走。一天下来,小明到底买了多少物品呢?
【输入格式】
输入共 3 行:
第一行是一个整数 N,表示商场中共有 N 种小明想买的物品(1≤N≤100);第二行共有 N 个整数,分别表示小明先后见到想买的物品的价格;第三行是一个整数 X,表示开始时小明共有 X 元零花钱。
【输出格式】
输出 1 行,包含一个整数,表示小明买到的物品数。
【样例输入】
6
7 5 9 10 7 4
30
【样例输出】
4
#include <bits/stdc++.h>
using namespace std;
int price[100];
int main() {
int n = 0, x = 0, cnt = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> price[i];
cin >> x;
for (int i = 0; i < n; i++){
if (x >= price[i]){ // 买得起就买
x -= price[i];
cnt++;
}
}
cout << cnt;
return 0;
}
第二题 进制转换
【题目描述】
小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用‘A’表示 10、‘F’表示 15。如果扩展到用‘Z’表示35,岂不是可以表示 36 进制数了嘛!
【输入格式】
输入 2 行,第一行包含一个正整数 N,第二行包含一个正整数R。保证 1≤N≤1000000,2≤R≤36
【输出格式】
输出 1 行,为 N 的 R 进制表示。
【样例输入】
123
25
【样例输出】
4N
#include <iostream>
using namespace std;
int main(){
string a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int n, r;
cin >> n >> r;
string temp = "";
while (n){
temp += a[n % r];
n /= r;
}
for (int i = temp.length() - 1; i >= 0; i--)
cout << temp[i];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
char res[30];
int len = 0;
char trans(int d) {
if (d < 10)
return (char)(d + '0');
return (char)(d + 'A' - 10);
}
int main() {
int n = 0, r = 0;
cin >> n >> r;
while (n > 0) {
res[len] = trans(n % r);
n /= r;
len++;
}
for (int i = len - 1; i >= 0; i--)
cout << res[i];
cout << endl;
return 0;
}