附录 A 三级知识点速查与错题订正表
本附录用于考前快速回顾。每一项都对应三级考试中容易出错的知识点,适合在考前最后一天快速翻阅,也适合学生订正错题时对照查找原因。
一、数据编码速查
| 知识点 |
结论 |
| 原码最高位 |
符号位,0 表示正数,1 表示负数 |
| 8 位原码范围 |
$-127 \sim 127$ |
| 8 位补码范围 |
$-128 \sim 127$ |
| 正数的原码、反码、补码 |
完全相同 |
| 负数反码 |
符号位不变,数值位取反 |
| 负数补码 |
反码加 1 |
| 补码转真值 |
若最高位为 1,取反加一得到绝对值,再加负号 |
~x |
补码下等于 $-x - 1$ |
~0 |
$-1$ |
常错点
| 错误写法或想法 |
正确理解 |
| 8 位原码能表示 $-128$ |
错,8 位原码最小是 $-127$ |
| 补码和原码范围相同 |
错,补码多表示一个 $-128$ |
~5 = -5 |
错,~5 = -6 |
11111111 是 255 |
若按 8 位补码解释,它是 $-1$ |
二、ASCII 与字符速查
| 字符 |
ASCII 值 |
'\0' |
0 |
空格 ' ' |
32 |
'0' |
48 |
'1' |
49 |
'9' |
57 |
'A' |
65 |
'Z' |
90 |
'a' |
97 |
'z' |
122 |
常用写法
int x = c ‐ '0';
char c = x + '0';
if (c >= '0' && c <= '9') // 数字字符;
if (c >= 'A' && c <= 'Z') // 大写字母;
if (c >= 'a' && c <= 'z') // 小写字母;
c += 'A' ‐ 'a'; // 小写转大写
c += 'a' ‐ 'A'; // 大写转小写
常错点
| 错误写法或想法 |
正确理解 |
'0' 的值是 0 |
错,'0' 的 ASCII 值是 48 |
'\0' 和 '0' 相同 |
错,前者是空字符,后者是数字字符 |
'A' <= c <= 'Z' |
错,应写 c >= 'A' && c <= 'Z' |
数字字符判断写 c >= 0 && c <= 9 |
错,应写 c >= '0' && c <= '9' |
三、进制转换速查
| 转换方向 |
方法 |
| 二进制转十进制 |
按 2 的位权展开 |
| 八进制转十进制 |
按 8 的位权展开 |
| 十六进制转十进制 |
按 16 的位权展开 |
| 十进制转二进制 |
除 2 取余,倒序 |
| 十进制转八进制 |
除 8 取余,倒序 |
| 十进制转十六进制 |
除 16 取余,倒序 |
| 二进制转八进制 |
从右往左每 3 位一组 |
| 二进制转十六进制 |
从右往左每 4 位一组 |
C++ 进制前缀
| 写法 |
含义 |
25 |
十进制 |
025 |
八进制 |
0x25 |
十六进制 |
0b1010 |
二进制 |
输出控制
cout << dec << x; // 十进制
cout << oct << x; // 八进制
cout << hex << x; // 十六进制
常错点
| 错误写法或想法 |
正确理解 |
015 是十进制 15 |
错,015 是八进制,等于十进制 13 |
0x10 是十进制 10 |
错,0x10 等于十进制 16 |
| 二进制转八进制从左往右分组 |
整数部分应从右往左每 3 位分组 |
substr 和进制无关却混在一起算 |
进制题先看前缀和位权 |
四、位运算速查
| 运算符 |
名称 |
规则 |
& |
按位与 |
两位都为 1 才为 1 |
\| |
按位或 |
至少一位为 1 就为 1 |
^ |
按位异或 |
两位不同为 1 |
~ |
按位取反 |
每一位取反 |
<< |
左移 |
右侧补 0 |
>> |
右移 |
非负整数常相当于除以 2 的幂 |
常用结论
x ^ x == 0
x ^ 0 == x
(x & 1) == 0 // x 是偶数
(x & 1) == 1 // x 是奇数
a & ~1 // 清除最低位
a & (~3) // 清除最低两位
常错点
| 错误写法或想法 |
正确理解 |
& 和 && 相同 |
错,& 是按位与,&& 是逻辑与 |
\| 和 \|\| 相同 |
错,\| 是按位或,\|\| 是逻辑或 |
~x 是 $-x$ |
错,补码下 ~x = -x - 1 |
| 位运算直接看十进制猜 |
应写成二进制逐位计算 |
五、数组速查
基本规则
| 写法 |
含义 |
int a[5]; |
定义 5 个 int 元素 |
| 合法下标 |
0, 1, 2, 3, 4 |
a[5] |
越界 |
int a[5] = {1, 2}; |
后面元素自动补 0 |
| 全局数组未初始化 |
默认全为 0 |
| 局部数组未初始化 |
值不确定 |
sizeof(a) |
数组总字节数 |
sizeof(a)/sizeof(a[0]) |
普通数组元素个数 |
常用模板
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cout << a[i] << " ";
int mx = a[1];
for (int i = 2; i <= n; i++)
if (a[i] > mx) mx = a[i];
int pos = 1;
for (int i = 2; i <= n; i++)
if (a[i] >= a[pos]) pos = i;
常错点
| 错误写法或想法 |
正确理解 |
| 长度为 $n$ 的数组最大下标是 $n$ |
错,最大合法下标是 $n - 1$ |
| 局部数组默认全 0 |
错,局部数组未初始化时值不确定 |
| 查最大值初始为 0 |
若全是负数会错,应初始为 a[1] |
最大值最后位置用 > |
错,最后位置应使用 >= |
| 输入从 1 开始,输出从 0 开始 |
容易漏项或输出未使用位置 |
六、字符数组速查
| 内容 |
结论 |
char s[] = "abc"; |
实际长度为 4 |
| 末尾字符 |
自动添加 '\0' |
strlen(s) |
统计 '\0' 前的字符数 |
sizeof(s) |
数组占用字节数 |
| 字符数组赋值 |
定义后不能直接 s = "abc" |
| 字符数组复制 |
用 strcpy(s, "abc") |
| 字符数组比较 |
用 strcmp(a, b) == 0 |
常用模板
char s[105];
cin >> s;
cout << strlen(s);
char a[105], b[105];
cin >> a >> b;
if (strcmp(a, b) == 0) cout << "Same";
else cout << "Different";
常错点
| 错误写法或想法 |
正确理解 |
char s[] = "abc"; 长度是 3 |
错,末尾还有 '\0',长度是 4 |
strlen 统计数组总长度 |
错,只统计 '\0' 前的字符 |
字符数组可以用 == 比内容 |
错,应使用 strcmp() |
定义后写 s = "abc" |
错,应使用 strcpy() |
手写 {'a', 'b', 'c'} 一定是字符串 |
没有 '\0',不能安全当字符串输出 |
七、string 速查
| 函数或写法 |
含义 |
s.length() |
字符串长度 |
s.size() |
字符串长度 |
s[i] |
访问第 $i$ 个字符,下标从 0 开始 |
s.substr(pos, len) |
从 pos 开始取 len 个字符 |
s.substr(pos) |
从 pos 取到末尾 |
s.find(t) |
查找第一次出现位置 |
s.rfind(t) |
查找最后一次出现位置 |
string::npos |
表示没找到 |
s.insert(pos, t) |
在 pos 前插入 |
s.replace(pos, len, t) |
替换从 pos 开始的 len 个字符 |
常用模板
for (int i = 0; i < s.length(); i++) {
// 处理 s[i]
}
int l = 0, r = s.length() ‐ 1;
while (l < r) {
if (s[l] != s[r]) ok = false;
l++;
r--;
}
常错点
| 错误写法或想法 |
正确理解 |
| 字符串下标从 1 开始 |
错,从 0 开始 |
最后一个下标是 s.length() |
错,应为 s.length() - 1 |
substr(2, 3) 表示取到下标 3 |
错,第二个参数是长度 |
find 和 rfind 一定相同 |
错,一个找第一次,一个找最后一次 |
find 找不到返回 $-1$ |
标准写法应与 string::npos 比较 |
八、枚举法速查
枚举三句话
- 枚举对象是什么?
- 枚举范围是多少?
- 判断条件是什么?
常用模板
for (int i = l; i <= r; i++) {
if (条件) ans++;
}
三位数拆位:
int a = x / 100;
int b = (x / 10) % 10;
int c = x % 10;
区间数字出现次数:
for (int i = l; i <= r; i++) {
int x = i;
while (x > 0) {
if (x % 10 == d) ans++;
x /= 10;
}
}
鸡兔同笼:
for (int c = 0; c <= h; c++) {
int r = h ‐ c;
if (2 * c + 4 * r == f) {
cout << c << " " << r;
return 0;
}
}
cout << "No";
常错点
| 错误写法或想法 |
正确理解 |
| 三位数从 0 枚举到 999 |
应从 100 到 999 |
十位写成 x / 10 |
应写 (x / 10) % 10 |
| 拆位时直接修改循环变量 |
应复制到临时变量 |
| 鸡兔同笼同时枚举两种动物 |
可以,但枚举鸡后兔可由总头数推出 |
| 找第一个答案后还继续输出 |
找第一个时应及时 return 或 break |
九、模拟法速查
模拟四句话
- 初始状态是什么?
- 每一步做什么?
- 什么时候停止?
- 最后输出什么?
常用模板
while (还没结束) {
执行一步操作;
更新状态;
更新答案;
}
字符串加密:
for (int i = 0; i < s.length(); i++) {
int x = s[i] ‐ 'a';
x = (x + k) % 26;
s[i] = x + 'a';
}
密码检测:
bool len = s.length() >= 8;
bool up = false, low = false, dig = false;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'A' && s[i] <= 'Z') up = true;
if (s[i] >= 'a' && s[i] <= 'z') low = true;
if (s[i] >= '0' && s[i] <= '9') dig = true;
}
数组清零:
while (1) {
int pos = 1;
for (int i = 2; i <= n; i++)
if (a[i] >= a[pos]) pos = i;
if (a[pos] == 0) break;
int mn = a[pos];
for (int i = 1; i <= n; i++)
if (a[i] > 0 && a[i] < mn) mn = a[i];
a[pos] ‐= mn;
ans++;
}
常错点
| 错误写法或想法 |
正确理解 |
| 模拟步骤可以随便调换 |
错,顺序必须按题意 |
小写加密只判断 s[i] > 'z' |
应判断移动后是否越界 |
| 布尔变量不初始化 |
错,必须初始化 |
| 数组清零最小值包含 0 |
错,要找最小正数 |
多个最大值取最后却用 > |
应用 >= |
十、错题订正表
学生每次订正时,可以填写下面表格。每道错题至少写清 “错因” 和 “正确规则”。
错因示例
| 错因 |
对应规则 |
把 021 当成十进制 |
C++ 中前缀 0 表示八进制 |
把 substr 第二个参数当结束下标 |
substr(pos, len) 的第二个参数是长度 |
忘记字符数组末尾 '\0' |
字符数组字符串用 '\0' 结束 |
最大值最后位置用了 > |
最后位置应使用 >= |
| 修改了外层循环变量 |
数位拆分要使用临时变量 |
数字字符判断写成 0 \sim 9 |
应写 '0' 到 '9' |
| 数组下标多循环一位 |
长度 $n$ 的数组下标是 $0 \sim n - 1$ |
| 数组清零把 0 当最小值 |
应找最小正数 |
十一、考前最后一页
考前最后翻这一页:
- 补码看位数。
- 八进制看前缀 0。
- 十六进制看前缀 0x。
- 字符 '0' 不是整数 0。
- '\0' 才是 ASCII 0。
- 位运算先写二进制。
- 数组下标从 0 开始。
- 长度 $n$ 的数组最大下标是 $n - 1$。
- 局部数组未初始化值不确定。
- sizeof 看数组空间。
- strlen 看 '\0' 前的长度。
- substr 第二个参数是长度。
- find 找第一次,rfind 找最后一次。
- 字符数组比较用 strcmp。
- 三位数范围是 100 到 999。
- 十位数字是 (x / 10) % 10。
- 拆位不要修改循环变量。
- 最大值第一次用 >,最后一次用 >=。
- 数字字符判断用 '0' 到 '9'。
- 模拟题按题目顺序写。
这 20 条能覆盖三级考试中最常见的失分点。考前不需要再扩展新内容,把这些规则看熟,做题时慢一点读条件,程序写完后查一遍边界和输出格式。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com