Appearance
不恢复余数除法(加减交替法)
考情分析
加减交替法是恢复余数法的改进版,408 中两种除法都可能考,但加减交替法更常见。核心考察"余数符号决定下一步做加还是做减"的规则,以及最终余数的修正条件。
从恢复余数法推导
恢复余数法中,当余数
如果跳过恢复,直接对负余数左移再加
两者结果完全相同。这意味着"不够减"时根本不需要恢复,只需记住下一步改做加法即可。
运算规则
口诀:余数为正做减法,余数为负做加法。每步固定一次加法或减法,步骤数完全固定。
最终余数修正
若最后一步余数为负(末位商 0),需执行一次修正:
原因:最后一步不够减时,后续没有左移来"消化"这个负余数,所以需要真正恢复一次。
算法流程
输入:被除数 |X|,除数 |Y|
初始:R = |X|,先做一次试减 R = R - |Y|
if R >= 0: 商首位 1
else: 商首位 0
for i = 1 to n-1:
R = R << 1 // 左移
if 上一步余数 >= 0:
R = R - |Y| // 减
else:
R = R + |Y| // 加
判断 R 正负,记录商位
// 最终修正
if R < 0:
末位商取 0,R = R + |Y|教材差异
有的教材先移位后运算,有的先运算后移位,两者逻辑等价但中间步骤不同。考试时认准一种写法保持一致。
交互可视化
例题
例 1:用加减交替法计算
采用"先运算后左移"的写法:
| 步骤 | 操作 | 余数 | 商位 |
|---|---|---|---|
| 初始 | 0.1011 | ||
| 第 1 步 | 1.1110(负) | 商 0 | |
| 左移 | 1.1100 | ||
| 第 2 步 | 0.1001(正) | 商 1 | |
| 左移 | 1.0010 | ||
| 第 3 步 | 0.0101(正) | 商 1 | |
| 左移 | 0.1010 | ||
| 第 4 步 | 1.1101(负) | 商 0 |
末位余数为负,修正:
商 = 0.0110,余数 =
与恢复余数法结果完全一致,但全程没有做过恢复操作(除最终修正外)。
例 2:用加减交替法计算
符号处理:
取绝对值
| 步骤 | 操作 | 余数 | 商位 |
|---|---|---|---|
| 第 1 步 | 1.1101(负) | 0 | |
| 左移 | 1.1010 | ||
| 第 2 步 | 0.0101(正) | 1 | |
| 左移 | 0.1010 | ||
| 第 3 步 | 1.1111(负) | 0 | |
| 左移 | 1.1110 | ||
| 第 4 步 | 0.1001(正) | 1 |
商的绝对值 = 0.0101,余数正无需修正。
最终:商 =
与恢复余数法的对比
| 特性 | 恢复余数法 | 加减交替法 |
|---|---|---|
| 每步操作次数 | 最多 2 次(试减+恢复) | 恰好 1 次 |
| 步骤数 | 不固定 | 固定 |
| 最终修正 | 不需要 | 末位余数为负时需修正 |
| 硬件效率 | 低 | 高,实际计算机采用 |
| 控制逻辑 | 需要条件分支 | 更规整 |
补码加减交替法(扩展)
上面讨论的是原码除法。408 偶尔也会涉及补码加减交替法,规则略有不同:
- 被除数与除数同号:初始做减法
- 被除数与除数异号:初始做加法
- 余数与除数同号 → 商 1,下一步做减
- 余数与除数异号 → 商 0,下一步做加
- 末位恒置 1(精度损失
)
补码除法的商直接就是补码表示,不需要单独处理符号。
考点清单
- [ ] 加减交替法核心规则:正余数下一步减,负余数下一步加
- [ ] 每步操作固定为一次加/减法
- [ ] 最终余数为负时需修正
- [ ] 与恢复余数法的推导关系:
- [ ] 原码除法符号位单独处理(异或),余数符号与被除数相同
- [ ] 步骤数固定为
(数值位位数),效率优于恢复余数法