NOIP初赛_总结
小知识点总结
- d+i=&d[i]
- 图像的的存储计算公式 : 长 _ 宽 _ 深度(位:如 16 位)
长和宽需换算成分辨率(就是像素) 如: 1024*248 注意:真彩色为 32 位
16 位图深度就是十六 - 1Byte (B) = 8bit(位)
- 计算机的一些特殊逻辑运算
基础知识
逻辑运算和二进制运算
- 非: ! ¬
- 与(and): & ∧
- 或(or): | ∨
- 异或(xor): ⊕ ∧ 注意不同与逻辑与
- 按位取反 ~
- << 左移,最右边补 0
- >> 右移,标准没有规定最左边补什么!
实践上,unsigned 直接补 0;signed 复制原先的最高位。
异或运算法则:转换为二进制 看每一位 如有不同取 1 否则取 0
e.g:0101 ∧ 0011 = 0110
真值,原码,反码,补码
- 真值:e.g 10011 和 -111001
- 原码:符号位正为 0,负为 1,其他与真值相同. e.g 010011 和 1111001
- 反码:
- 补码
补码是这样一套体系:
[0,2^31−1]这 2^31 个非负数,直接存储二进制。
[−2^31,−1]这 2^31 个负数,存储其相应正数的加法逆元。
e.g.
7 存储为 000...00111
-7 存储为 111...11001
加法逆元: 𝑥 和 inv(𝑥) 加在一起,变成 0.
初赛数学
多学学高中数学吧。。。不然会死人的!
排列组合
- 往后数下一个排列
1 2 3 的所有排列如下:
123 132 213 312 321
往后数下一个排列就是按字典序的下一个
如 132 的下一个排列为 213 注意 123 前无排列,321 后无排列
e.g 164532往后数10给排列为:
164532
165234
165243
165324
165342
165423
165432
213456
213465
213546
注: 可用STL函数 next_permutation(arr, arr+size); 获取后面的排列
头文件 #include <algorithm>
参数说明:arr: 数组名 size:数组元素个数
详见[学习C++ ]C++ STL 全排列函数详解(排列组合与匹配算法)--1
进制转换
进制只是一种表示并不改变运算规律
如果你能背掉七进制的乘法口诀表,呵呵
基础
- 其他进制转十进制:乘幂,再加法(通过进制的本质来转换)
- 十进制转其他进制:短除法
- 分数进制转换类比于小数的进制转换
技巧
- 二进制与二的次方进制间的转换,如 2->8,2->16,16->2,8->2之类
-
2->8 :
因为8为2的3次方,所以每三位划分一下,转为8进制后直接拼起来即可
一定要补齐: 如10110.0011补齐为|010|110|.|001|100|
转化为 2 6 . 1 4 (8)
注意整数从右往左,小数从左往右,就是从靠近小数点的一方开始补齐 -
16->2
每一个16进制字符化为4位二进制数即可,例:
3A7.B1 H = |0011|1010|0111|.|1011|0001| B 即 1110100111.10110001
- 无限不循环小数转分数,如:
. .
0.14285714257…
将循环节 142857 截取,应为 142857 有六位,就用 142857/999999,约分得到 1/7
即 0.142827142857…… 可表示为 1/7