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|(定点小数,要求 |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 时余数需真正恢复一次

最容易错的一步

与恢复余数法相同:首次试减只是溢出判断(商的整数位 q0),不是第一个小数商位。n 个小数商位都从"左移之后"的加/减开始取。把 q0 当成 q1,整条商会错位一位。

教材差异

有的教材先移位后运算,有的先运算后移位,两者逻辑等价但中间步骤不同。考试时认准一种写法保持一致。

交互可视化

加载可视化中...

例题

例 1:用加减交替法计算 0.1011÷0.1101(正数,4 位数值位)

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

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

步骤操作余数 R商位
初始0.1011
首次试减RY=0.1011+1.0011=1.11101.1110(负)q0=0(不溢出,不计入商)
左移1.1100
第 1 步上步余数负 → R+Y=1.1100+0.1101=0.10010.1001(正)q1=1
左移1.0010
第 2 步上步余数正 → RY=1.0010+1.0011=0.01010.0101(正)q2=1
左移0.1010
第 3 步上步余数正 → RY=0.1010+1.0011=1.11011.1101(负)q3=0
左移1.1010
第 4 步上步余数负 → R+Y=1.1010+0.1101=0.01110.0111(正)q4=1

末位余数为正,无需修正。

= 0.1101余数 = 0.0111×24

与恢复余数法结果完全一致,但全程没有做过恢复操作。注意首次试减后余数为负时不恢复,直接左移后按规则做加法——这正是"加减交替"名字的由来。

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

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

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

步骤操作余数商位
首次试减0.1000+1.0101=1.11011.1101(负)q0=0(不溢出,不计入商)
左移1.1010
第 1 步上步余数负 → R+Y=1.1010+0.1011=0.01010.0101(正)q1=1
左移0.1010
第 2 步上步余数正 → RY=0.1010+1.0101=1.11111.1111(负)q2=0
左移1.1110
第 3 步上步余数负 → R+Y=1.1110+0.1011=0.10010.1001(正)q3=1
左移1.0010
第 4 步上步余数正 → RY=1.0010+1.0101=0.01110.0111(正)q4=1

商的绝对值 = 0.1011,末位余数为正无需修正。

最终:商 = 0.1011(原码 1.1011),余数 = 0.0111×24(余数符号与被除数同号,取负)。

验证:0.10112×0.10112+0.01112×24=121256+7256=128256=0.10002=|X|

与恢复余数法的对比

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

补码加减交替法(扩展)

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

  • 被除数与除数同号:初始做减法
  • 被除数与除数异号:初始做加法
  • 余数与除数同号 → 商 1,下一步做减
  • 余数与除数异号 → 商 0,下一步做加
  • 末位恒置 1(精度损失最大 2n;这是补码加减交替法专属的简化约定,与上文原码除法"末位余数为负才修正"的处理不同,别混用)

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

考点清单

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