CSP-J 2024 入门级 第一轮试题(初赛)答案及解析
一、单项选择题
- 32 位 int 类型的存储范围是( )
A. -2147483647 ~ +2147483647
B. -2147483647 ~ +2147483648
C. -2147483648 ~ +2147483647
D. -2147483648 ~ +2147483648
答:C
int是32位有符号整型,
当机器数为0111 1111 1111 1111 1111 1111 1111 1111时,表示的数值最大,为 2 31 − 1 2^{31}-1 231−1
当机器数为1000 0000 0000 0000 0000 0000 0000 0000时,表示的数值最小,为 − 2 31 -2^{31} −231
因此int可以表示的数值范围为 − 2 31 ∼ 2 31 − 1 -2^{31}\sim 2^{31}-1 −231∼231−1,算出来的结果是 − 2147483648 ∼ 2147483647 -2147483648\sim 2147483647 −2147483648∼2147483647,选C。
- 计算
(
1
4
8
−
101
0
2
)
∗
D
16
−
110
1
2
(14_8 − 1010_2)∗D_{16} − 1101_2
(148−10102)∗D16−11012的结果,并选择答案的十进制值:( )
A.13
B.14
C.15
D.16
答:A
将数字都转为二进制。每位8进制数字转为3位二进制数字,每位16进制数字转为4位二进制数字。
1 4 8 = 110 0 2 14_8=1100_2 148=11002, D 16 = 110 1 2 D_{16}=1101_2 D16=11012
所以原式为 ( 1100 − 1010 ) ∗ 1101 − 1101 = ( 1100 − 1010 − 1 ) ∗ 1101 = ( 10 − 1 ) ∗ 1101 = 1101 (1100-1010)*1101-1101=(1100-1010-1)*1101=(10-1)*1101=1101 (1100−1010)∗1101−1101=(1100−1010−1)∗1101=(10−1)∗1101=1101
110 1 2 = 2 3 + 2 2 + 2 0 = 8 + 4 + 1 = 13 1101_2=2^3+2^2+2^0=8+4+1=13 11012=23+22+20=8+4+1=13,选A。
- 某公司有 10 名员工,分为 3 个部门:A 部门有 4 名员工,B 部门有 3 名员工、C 部门有 3 名员工。现需要从这 10 名员工中选出 4 名组成一个工作组,且每个部门至少要有 1 人。问有多少种选择方式?( )
A.120
B.126
C.132
D.238
答:B
先分类,再分步。
A部门出2人,B部门出1人,C部门出1人,情况数为: C ( 4 , 2 ) C ( 3 , 1 ) C ( 3 , 1 ) = 6 ∗ 3 ∗ 3 = 54 C(4,2)C(3,1)C(3,1)=6*3*3=54 C(4,2)C(3,1)C(3,1)=6∗3∗3=54
A部门出1人,B部门出2人,C部门出1人,情况数为: C ( 4 , 1 ) C ( 3 , 2 ) C ( 3 , 1 ) = 4 ∗ 3 ∗ 3 = 36 C(4,1)C(3,2)C(3,1)=4*3*3=36 C(4,1)C(3,2)C(3,1)=4∗3∗3=36
A部门出1人,B部门出1人,C部门出2人,情况数为: C ( 4 , 1 ) C ( 3 , 1 ) C ( 3 , 2 ) = 4 ∗ 3 ∗ 3 = 36 C(4,1)C(3,1)C(3,2)=4*3*3=36 C(4,1)C(3,1)C(3,2)=4∗3∗3=36
共有 54 + 36 + 36 = 126 54+36+36=126 54+36+36=126种情况
- 以下哪个序列对应数组 0 至 8 的 4 位二进制格雷码(Gray code)?
A.0000,0001,0011,0010,0110,0111,0101,1000
B.0000,0001,0011,0010,0110,0111,0100,0101
C.0000,0001,0011,0010,0100,0101,0111,0110
D.0000,0001,0011,0010,0110,0111,0101,0100
答:D
格雷码的任意两个相邻的数码只有一位二进制数不同,根据这一特性,使用排除法可以得到选项D。
生成格雷码的方法如下:
- 1位格雷码有0与1
- (n+1)位格雷码中的前 2 n 2^n 2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
- (n+1)位格雷码中的后 2 n 2^n 2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
格雷码位数 | 格雷码 |
---|---|
1 | 0, 1 |
2 | 00, 01, 11, 10 |
3 | 000, 001, 011, 010, 110, 111, 101, 100 |
4 | 0000, 0001, 0011, 0010, 0110, 0111, 0101, 0100, 1100, 1101, 1111, 1110, 1010, 1011, 1001, 1000 |
- 记 1KB 为 1024 字节(byte),1MB 为 1024KB,那么 1MB 是多少二进制位(bit)?
A.1000000
B.1048576
C.8000000
D.8388608
答:D
1字节占用8二进制位,也就是 1 B = 8 b 1B=8b 1B=8b, 1 M B = 1024 K B = 1024 ∗ 1024 B = 8 ∗ 1024 ∗ 1024 b = 8388608 b 1MB=1024KB=1024*1024B=8*1024*1024b=8388608b 1MB=1024KB=1024∗1024B=8∗1024∗1024b=8388608b
如想偷懒,可以只算结果的个位数字,也就是 8 ∗ 1024 ∗ 1024 % 10 = 8 ∗ ( 1024 % 10 ) 2 % 10 = 8 ∗ ( 4 2 % 10 ) = 8 ∗ 6 % 10 = 8 8*1024*1024\%10=8*(1024\%10)^2\%10=8*(4^2\%10)=8*6\%10=8 8∗1024∗1024%10=8∗(1024%10)2%10=8∗(42%10)=8∗6%10=8
因此结果个位为8,选D。
- 以下哪个不是 C++中的基本数据类型?
A. int
B. float
C. struct
D. char
答:C
struct 不是基本数据类型,struct定义出的结构体(或者叫类)是复合数据类型。其余的int, float, char都是C++的基本数据类型。
- 以下哪个不是 C++中的循环语句?
A. for
B. while
C. do-while
D. repeat-untill
答:D
C++中有for、while和do…while循环。
Repeat-untill 是 Pascal、lua 等语言中的直到循环语句,C++并不支持。
- 在 C/C++中,(char)(‘a’+13)与下面的哪一个值相等( )
A. ’m’
B. ‘n’
C. ‘z’
D. ‘3’
答:B
第1个字母’a’的ASCII码为97,也就是’a’+0
第2个字母’b’的ASCII码为98,也就是’a’+1
…
第i个字母的ASCII码为’a’+i-1
‘a’+13为第14个字母的ASCII码,第14个字母为’n’,选B。
- 假设有序表中有 1000 个元素,则用二分法查找元素 x 最多需要比较( )次
A.25
B.10
C.7
D.1
答:B
n个元素的有序序列进行二分查找的比较次数为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor +1 ⌊log2n⌋+1(二分查找最大比较次数证明)
本题中n=1000,代入公式得: ⌊ log 2 1000 ⌋ + 1 \lfloor \log_21000 \rfloor +1 ⌊log21000⌋+1
已知 2 9 = 512 2^9=512 29=512, 2 10 = 1024 2^{10}=1024 210=1024,所以 2 9 < 1000 < 2 10 2^9<1000<2^{10} 29<1000<210
不等式取以2为底的对数,得: 9 < log 2 1000 < 10 9<\log_21000<10 9<log21000<10
所以 ⌊ log 2 1000 ⌋ = 9 \lfloor \log_21000 \rfloor=9 ⌊log21000⌋=9
所以 ⌊ log 2 1000 ⌋ + 1 = 10 \lfloor \log_21000 \rfloor +1=10 ⌊log21000⌋+1=10,选B
- 下面哪一个不是操作系统名字( )
A. Notepad
B. Linux
C. Windows
D. macOS
答:A
Notepad是Windows自带的记事本程序,是应用程序。
Linux是开源的类Unix操作系统
Windows是微软开发的操作系统
maxOS是苹果开发的类Unix操作系统
- 在无向图中,所有顶点的度数之和等于( )
A. 图的边数
B. 图的边数的两倍
C. 图的定点数
D. 图的定点数的两倍
答:B
图中一条边贡献两个度,因此所有顶点度数之和等于边数的两倍
- 已知二叉树的前序遍历为[A,B,D,E,C,F,G],中序遍历为[D,B,E,A,F,C,G],求二叉树的后序遍历
的结果是( )
A. [D,E,B,F,G,C,A]
B. [D,E,B,F,G,A,C]
C. [D,B,E,F,G,C,A]
D. [D,E,B,F,G,A,C]
答:A
已知前序中序遍历序列建树,算法见ybt 1339:【例3-4】求后序遍历
建树为
其后序遍历为DEBFGCA,选A。
- 给定一个空栈,支持入栈和出栈操作。若入栈操作的元素依次是 1 2 3 4 5 6,其中 1 最先入栈,6 最后入栈,下面哪种出栈顺序是不可能的( )
A.6 5 4 3 2 1
B.1 6 5 4 3 2
C.2 4 6 5 3 1
D.1 3 5 2 4 6
答:D
入栈顺序是1,2,3,4,5,6,
如果1 2 3 4 5 6都先按顺序入栈,而后不断出栈直到栈空,出栈顺序就是6 5 4 3 2 1,A选项是可行的。
这类问题的思考方式为:如果x出栈,那么在x前入栈的元素除了已出栈的元素都在栈内。
对于B选项,1 6出栈后,栈内从栈底到栈顶分别是2 3 4 5,依次出栈得到5 4 3 2,B选项是可行的。
对于C选项,1入栈,2入栈并出栈,3入栈,4入栈并出栈,5入栈,6入栈并出栈,此时栈内从栈底到栈顶是1 3 5,依次出栈得到5 3 1,是可行的。
对于D选项,1入栈后出栈,2入栈,3入栈后出栈,4入栈,5入栈后出栈,此时栈内从栈底到栈顶是2 4,栈顶是4,2不可能先于4出栈,所以D选项是不可行的。
- 有 5 个男生和 3 个女生站成一排,规定 3 个女生必须相邻,问有多少种不同的排列方式?
A. 4320 种
B. 5040 种
C. 3600 种
D. 2880 种
答:A
第一步,将三个女生站在一起作为一个整体(捆绑法),该整体的情况数为三个女生的全排列,为 P ( 3 , 3 ) P(3,3) P(3,3)
而后第二步5个男生与女生整体一共6个元素,进行全排列,方案数为 P ( 6 , 6 ) P(6,6) P(6,6)
总排列方案数为 P ( 3 , 3 ) ∗ P ( 6 , 6 ) = 3 ∗ 2 ∗ 1 ∗ 6 ∗ 5 ∗ 4 ∗ 3 ∗ 2 ∗ 1 = 4320 P(3,3)*P(6,6)=3*2*1*6*5*4*3*2*1=4320 P(3,3)∗P(6,6)=3∗2∗1∗6∗5∗4∗3∗2∗1=4320,选A。
- 编译器的主要作用是什么( )?
A. 直接执行源代码
B. 将源代码转换为机器代码
C. 进行代码调试
D. 管理程序运行时的内存
答:B
源代码不能直接执行,A错误。
进行代码调试的工具是调试器,比如GDB。
程序内可以通过代码管理程序运行时的内存,操作系统也可以管理各个进程的内存使用。
编译器的作用是对于编译型语言可以将源代码(比如C++代码)编译成为机器可以直接运行的机器代码,也就是CPU指令,选B。