火龙信奥
  • 分享
  • 课程
  • 题库
  • CSES
    • GESP
    • CSP
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • e课堂
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

附录 A 三级知识点速查与错题订正表

作者: 作者的头像   huolong , 时间:2026-09-08 10:12:09 , 所有人可见, 阅读  12

附录 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 比较

八、枚举法速查

枚举三句话

  1. 枚举对象是什么?
  2. 枚举范围是多少?
  3. 判断条件是什么?

常用模板

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

九、模拟法速查

模拟四句话

  1. 初始状态是什么?
  2. 每一步做什么?
  3. 什么时候停止?
  4. 最后输出什么?

常用模板

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

关于火龙

  • 关于我们
  • 学员获奖
  • 预约试听
  • ACM课程
  • CSP课程
  • 学习指南

帮助中心

  • 用户协议
  • 打字练习 HOT
  • 在线画图
  • DevC++下载
  • CSP报名
  • GESP官网

推荐课程

  • C++零基础入门(可试看)
  • C++进阶提升
  • GESP考级辅导
  • GESP打卡
  • CSP-J/S打卡

公众号

火龙信奥公众号二维码

© 2017-2026 义乌市睿码科技有限公司版权所有 浙ICP备2021013995号

火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码