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