学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_csp历年真题_热爱编程的通信人的博客-CSDN博客
1、在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )
A.unsigned
B.const
C.static
D.mutable
【答案】:B
【解析】
unsigned表示无符号,static静态变量是在程序运行期间保持其存在和值,mutable修饰的变量,将永远处在可变的状态。const修饰的变量是不能被更新的
2、八进制数12345670(8)和07654321(8)的和为( )
A.22222221(8)
B.21111111(8)
C.22111111(8)
D.22222211(8)
【答案】:D
【解析】
参考十进制的逢十进一的计算方法,八进制就是逢八进一,1234567890(8)+07654321(8)=22222211(8)
3、阅读下述代码, 请问修改data的value成员以存储3.14, 正确的方式是( )
union Data{
int num;
float value;
char symbol;
};
union Data data;
A.data.value = 3.14;
B.value.data = 3.14;
C.data->value = 3.14;
D.value->data = 3.14;
【答案】:A
【解析】
union和struct都是由不同的数据类型成员组成的,结构体所有成员占用的内存空间是累加的,而联合体中所有的成员共用一块地址空间。可以参考struct,访问其成员变量使用 类型变量名.成员变量名,即data.value。->用于指针的访问。选A
4、假设有一个链表的节点定义如下:
struct Node {
int data;
Node* next;
}
现在有一个指向链表头部的指针:Node* head, 如果想要在链表中插入一个新节点,其成员data的值为42, 并使新节点成为链表的第一个节点, 下面哪个操作是正确的?
A.Node* newNode = new Node; newNode->data = 42; newNode->next = head; head = newNode;
B.Node* newNode = new Node; head->data=42; newNode->next = head; head = newNode;
C.Node* newNode = new Node; newNode->data=42; head->next = newNode;
D.Node* newNode = new Node; newNode->data=42; newNode->next = head;
【答案】:A
【解析】
第一句,4个选项均相同,表示定义Node类型newNode。第二句表示将其成员的data的值设为42,使用newNode->data = 42。因为newNode要成为第一个节点,所以newNode->next需要指向现有的head,即newNode->next = head。此时newNode变为了head,所以A与D相比多了个这一句,head = newNode。
5、根节点的高度为1,一棵拥有2023个节点的三叉树高度至少为( )
A.6
B.7
C.8
D.9
【答案】:C
【解析】
“至少为”说明要求高度最小的值,画完全三叉树可以满足题目要求。第1层1个节点,第2层3个节点,第3层9个节点,第4层27个节点,第5层81个节点,第6层243个节点,第7层729个节点,第8层2187个节点。前7层相加为1093,不足2023,加上第8层超过2023,所以至少8层。
6、小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息。则小明一共有( )种选择时间段的方案。
A.31
B.18
C.21
D.33
【答案】:B
【解析】
假设七个时间段为1234567,依次枚举n个时间段的组合数。
选择1个时间段有7种:1、2、3、4、5、6、7
选择2个时间段有4+3+2+1=10种:14、15、16、17、25、26、27、36、37、47
选择3个时间段有1种:147
所以移动18种,选B
7、以下关于高精度运算的说法错误的是( )
A.高精度计算主要是用来处理大整数或需要保留多位小数的运算。
B.大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商。
C.高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关。
D.高精度加法运算的关键在于逐位相加并处理进位。
【答案】:C
【解析】
高精度乘法的运算时间与参与运算的两个整数的长度乘积有关,选C,具体高精度计算实现可以参考洛谷P1303题解。
8、后缀表达式“623+-382/+*2^3+”对应的中级表达式是( )。
A.((6-(2+3))*(3+8/2))^2+3
B.6-2+3*3+8/2^2+3
C.(6-(2+3))*((3+8/2)^2)+3
D.6-((2+3)*(3+8/2))^2+3
【答案】:A
【解析】
中缀变后缀有3个步骤,第一步加括号,第二步将运算符移到括号右边,第三步去除括号。这里反着做一遍。
加括号:((((6(23)+)-(3(82)/)+)*2)^3)+
括号移到中间:((((6-(2+3))*(3+(8/2)))^2)+3)
逐步移除多余括号,得到:((6-(2+3))*(3+8/2))^2+3
选A
9、数101010(2)和166(8)的和为( )。
A.10110000(2)
B.236(8)
C.158(10)
D.A0(16)
【答案】:D
【解析】
统一换算成十进制数后计算101010(2)=42(10),166(8)=118(10),160(10)=A0(16)=240(8)=10100000(2),选D
10、假设有一组字符{a,b,c,d,e,f},对应的频率分别为5%、9%、12%、13%、16%、45%。请问以下哪个选项是字符a,b,c,d,e,f分别对应的一组哈夫曼编码?( )
A.1111,1110,101,100,110,0
B.1010,1001,1000,011,010,00
C.000,001,010,011,10,11
D.1010,1011,110,111,00,01
【答案】:A
【解析】
按照哈夫曼规则画出哈夫曼树,f节点没有子节点,观察答案A,说明f为0,通过排除法可以直接选A。
11、给定一棵二叉树, 其前序遍历结果为:ABDECFG, 中序遍历结果为:DEBACFG。请问这棵树的正确后序遍历结果是什么?( )
A.EDBGFCA
B.EDGBFCA
C.DEBGFCA
D.DBEGFCA
【答案】:A
【解析】
中序遍历是先访问左子树,然后访问根,再访问右子树。前序遍历是先访问根,然后访问左子树,再访问右子树。后续遍历是先访问左子树,然后访问右子树,再访问根。
根据前序和中序遍历,可以画出二叉树,后序遍历为EDBGFCA,选A
12、考虑一个有向无环图,该图包含4条有向边:(1,2),(1,3),(2,4)和(3,4)。以下哪个选项是这个有向无环图的一个有效的拓扑排序?( )
A.4,2,3,1
B.1,2,3,4
C.1,2,4,3
D.2,1,3,4
【答案】:B
【解析】
访问2、3前需要先访问1,访问4前需要先访问2或3,选B
13、在计算机中,以下哪个选项描述的数据存储容量最小?( )
A.字节(byte)
B.比特(bit)
C.字(word)
D.千字节(kilobyte)
【答案】:B
【解析】
计算机最小存储单位是bit。字由若干个bit组成。选B
14、一个餐有10个男生和12个女生,如果要选出一个3人的小组,并且小组中必须至少包含1个女生,那么有多少种可能的组合?( )
A.1420
B.1770
C.1540
D.2200
【答案】A
【解析】
选1个女生,组合=C(12,1)*C(10,2)=540
选2个女生,组合=C(12,2)*C(10,1)=660
选3个女生,组合=C(12,3)=220
共计1420种组合
15、以下哪个不是操作系统?( )
A.Linux
B.Windows
C.Android
D.HTML
【答案】:D
【解析】
HTML是超文本标记语言,不是操作系统