Skip to content

不恢复余数除法(加减交替法)

考情分析

加减交替法是恢复余数法的改进版,408 中两种除法都可能考,但加减交替法更常见。核心考察"余数符号决定下一步做加还是做减"的规则,以及最终余数的修正条件。

从恢复余数法推导

恢复余数法中,当余数 Ri<0 时执行三步操作:

Ri+Y(恢复)左移2(Ri+Y)Y2(Ri+Y)Y=2Ri+Y

如果跳过恢复,直接对负余数左移再加 Y

2Ri+Y

两者结果完全相同。这意味着"不够减"时根本不需要恢复,只需记住下一步改做加法即可。

运算规则

Ri0商 1,Ri+1=2RiYRi<0商 0,Ri+1=2Ri+Y

口诀:余数为正做减法,余数为负做加法。每步固定一次加法或减法,步骤数完全固定。

最终余数修正

若最后一步余数为负(末位商 0),需执行一次修正:

R=Rn+Y

原因:最后一步不够减时,后续没有左移来"消化"这个负余数,所以需要真正恢复一次。

算法流程

输入:被除数 |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÷0.1101(正数,4 位数值位)

|X|=0.1011|Y|=0.1101[|Y|]=1.0011

采用"先运算后左移"的写法:

步骤操作余数 R商位
初始0.1011
第 1 步RY=0.1011+1.0011=1.11101.1110(负)商 0
左移1.1100
第 2 步R+Y=1.1100+0.1101=0.10010.1001(正)商 1
左移1.0010
第 3 步RY=1.0010+1.0011=0.01010.0101(正)商 1
左移0.1010
第 4 步RY=0.1010+1.0011=1.11011.1101(负)商 0

末位余数为负,修正:R+Y=1.1101+0.1101=0.1010

= 0.0110余数 = 0.1010×24

与恢复余数法结果完全一致,但全程没有做过恢复操作(除最终修正外)。

例 2:用加减交替法计算 X=0.1000Y=0.1011

符号处理:10=1,商为负。

取绝对值 |X|=0.1000|Y|=0.1011[|Y|]=1.0101

步骤操作余数商位
第 1 步0.1000+1.0101=1.11011.1101(负)0
左移1.1010
第 2 步1.1010+0.1011=0.01010.0101(正)1
左移0.1010
第 3 步0.1010+1.0101=1.11111.1111(负)0
左移1.1110
第 4 步1.1110+0.1011=0.10010.1001(正)1

商的绝对值 = 0.0101,余数正无需修正。

最终:商 = 0.0101(原码 1.0101),余数 = 0.1001×24(余数符号与被除数同号,取负)。

与恢复余数法的对比

特性恢复余数法加减交替法
每步操作次数最多 2 次(试减+恢复)恰好 1 次
步骤数不固定固定 n
最终修正不需要末位余数为负时需修正
硬件效率高,实际计算机采用
控制逻辑需要条件分支更规整

补码加减交替法(扩展)

上面讨论的是原码除法。408 偶尔也会涉及补码加减交替法,规则略有不同:

  • 被除数与除数同号:初始做减法
  • 被除数与除数异号:初始做加法
  • 余数与除数同号 → 商 1,下一步做减
  • 余数与除数异号 → 商 0,下一步做加
  • 末位恒置 1(精度损失 2n

补码除法的商直接就是补码表示,不需要单独处理符号。

考点清单

  • [ ] 加减交替法核心规则:正余数下一步减,负余数下一步加
  • [ ] 每步操作固定为一次加/减法
  • [ ] 最终余数为负时需修正 R=R+Y
  • [ ] 与恢复余数法的推导关系:2(R+Y)Y=2R+Y
  • [ ] 原码除法符号位单独处理(异或),余数符号与被除数相同
  • [ ] 步骤数固定为 n(数值位位数),效率优于恢复余数法