BCSP —— 小高组知识样题
下载链接
感谢wuboyan714提供题目
重点题目分析
1.进制转换
10进制转换任意进制
根据十进制转二进制的原理:十进制数除以2,余数为权位上的数,得到商继续除以2,直到商为0终止,然后反向取余数。我们可以举一反三:把里面的2替换成目标进制的数
任意进制转换10进制
把任意进制数按权展开、相加即得十进制数。
10进制转换任意进制 —— 小数
十进制小数转换成R进制小数采用“乘R取整,顺序输出”
原题:
将整数部分转换为二进制数:9 转换为二进制数为 1001。
将小数部分 0.375 转换为二进制数:
0.375 * 2 = 0.75,整数部分为 0,二进制数的下一位为 0。
0.75 * 2 = 1.5,整数部分为 1,二进制数的下一位为 1。
0.5 * 2 = 1,整数部分为 1,二进制数的下一位为 1。
0,小数部分为 0,结束。
因此,9.375 的二进制表示为 1001.011。
任意进制转换10进制
把R进制数按权展开、相加即得十进制数。
这里用一张别人的图片,这样更好理解
本图片出自 CSDN@爱躺平的威威
学了以上的方法,可以在多进制之间来回的转换,最终得出结果
2.图片大小计算
原题:
我们的思路:
可以先计算出单个图片的大小,然后除以96M
计算公式:
(
w
∗
h
∗
c
)
/
8
/
1024
/
1024
=
S
t
o
r
a
g
e
(w*h*c) / 8 / 1024 / 1024 = Storage
(w∗h∗c)/8/1024/1024=Storage
W
——宽
W——宽
W——宽
H
——高
H——高
H——高
S
t
o
r
a
g
e
——计算结果
(
用
M
B
表达
)
Storage——计算结果(用 MB 表达)
Storage——计算结果(用MB表达)
3.原码 反码 补码的计算
原码
原码就是机器码。
1的原码是0000 0001,-1的原码是1000 0001。
因为最高位是符号位,所以他的取值范围是[1111 1111,01111 1111] ,即[-127,127]。
反码
正数的反码是其本身。
负数的反码是其原码除符号位以外其余各位按位取反。-5的反码是1111 1010。
补码
正数的补码是其本身。
负数的补码是其反码+1。例如-5的补码是1111 1011。
可见对于负数而言,其反码和补码是无法直接看出来的,必须经过计算参能得出结果。
4.二叉树遍历
老生常谈的东西了
如果学习过二叉树的基本都会
记住这个口诀:
前序——根左右
中序——左根右
后续——左右根
这个口诀的意思也不难理解
就是:
根——根节点(指非叶节点的节点)
左——左子树(根左边的节点)
有——右子树(根右边的节点)
用C++遍历二叉树的方法自己上网搜,方法也非常简单(本文不写了)
5.C++枚举关键字
原题:
这个题目考的是C++的数据结构
这道题说实话对于小高组有点超标了
这题纯属考验积累
选
C
.
e
n
u
m
C.enum
C.enum
枚举类型的定义:枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
这道题了解这个关键字就行,因为在考试的时候一般不会问这种关键字详细的使用方法。
6.组合排序
这个点非常的重要,所以本文详细讲解一下啦~
排列
全排列公式
N
!
N!
N!
举例说明:
1 2 3 有三个数 所以N=3
排列:
1开头的
1 2 3
1 3 2
2开头的
2 1 3
2 3 1
3开头的
3 1 2
3 2 1
一共有3的阶乘个 也就是6个
捆绑排列公式
看一个最形象的例子
有5个同学需要排队,其中3个同学是三胞胎,因为各种原因,他们被要求要站一起,此时有多少种排列可能?(三胞胎自己内部也要排序)
这个题我们可以用捆绑法来解决
就是指把这三胞胎捆一起,看做一个人
此时就有3个人:
1(原来的1 2 3) 2 3
在用原来学过的全排列(变形一下)答案就是:36
过程:
3
!
=
6
3! = 6
3!=6
6
∗
6
=
36
6 * 6 = 36
6∗6=36
答案就是36
因为三胞胎内部自己也要排序
所以最后还要计算
6
∗
6
6*6
6∗6
组合公式
组合,英文名为Combination,简称C。数组{1, 2, 3, 4, 5},我们需要从数组中选择任意3个元素,那么有多少种方式呢?
根据前面的推导,我们能够得知,如果从5个元素中选择3个元素,排列的方式
有
P
(
5
,
3
)
=
5
!
(
5
−
3
)
!
=
60
P
(
5
,
3
)
=
5
!
(
5
−
3
)
!
=
60
P
(
5
,
3
)
=
(
5
−
3
)
!
5
!
=
60
有 P ( 5 , 3 ) = 5 ! ( 5 − 3 ) ! = 60 P(5, 3) = \frac{5!}{(5-3)!} = 60 P(5,3)=(5−3)!5!=60
有P(5,3)=5!(5−3)!=60P(5,3)=(5−3)!5!=60P(5,3)=(5−3)!5!=60种。但是组合的时候,对顺序是不敏感的,比如我们选1,2,3与选1,3,2,虽然是两种排列方式,但是在组合里是一种情况。3个元素的全排列一共有 3 ! = 6 3!=6 3!=6种,所以组合的公式为
C
(
N
,
K
)
=
!
N
!
!
K
(
N
−
k
)
C(N,K)=\frac{!N!}{!K(N−k)}
C(N,K)=!K(N−k)!N!
7.链表
链表的存储方法,以及操作都非常的简单
在STL模板中也有list
但还是 要复习一下!
此处没有链表的代码,想要抄作业的同学可以看下一篇了
一、链表特性
(1) 链表是由一系列的结点组成,结点包含两个域,一个数据域,一个指针域。
(2) 链表内存是非连续的,因此添加或删除元素,时间复杂度都是常数项,不需要移动元素,比数组添加删除效率高。
(3) 链表只有在需要的时候,才分配内存。
(4) 链表,只要拿到第一个结点,相当于拿到整个链表。
(5) 链表需要额外的空间保存结点的关系:前驱、后继关系。
二、链表和数组区别:
(1) 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
(2) 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据元素。(数组中插入、删除数据项时,需要移动其他数据项)
总结:不如直接用list或者vector(list就是链表,vector操作简单、而且基本都学过)
阅读程序
小技巧
1.程序填空
在做阅读程序填空的时候(完形填空DOGE)我们可以按照已经给的代码以及算法描述结合着看,这样不仅可以提高效率,还可以提高正确率
记得最后填完了,还有时间的话可以自己写样例
2.阅读程序
可以根据给出的代码来猜算法,这样可以大大的提高正确率
(如果猜不出来或者没有思路,可以先看数据范围)