不使用/或*运算符任何其他解决方案执行除法的最快方法

时间:2013-06-10 18:23:36

标签: algorithm

我正在关注Skiena的算法书。在第1章中,它给出了在不使用/或*运算符的情况下划分实数的问题。 我在python中实现了这样:

def main(dividend, divisor ):
    print "dividend : ",dividend
    print "divisor : ", divisor
    if dividend<divisor:
        print "dividend has to be greater than divisor"
        return;
    quotient=0
    sum=0
    while sum<dividend:
        sum = sum+divisor
        print "sum : ",sum
        quotient = quotient+1
        if sum>dividend:
            remainder = dividend-(sum-divisor)
            quotient=quotient-1
            print "remainder : ", remainder
    print "quotient :", quotient





    if __name__ == "__main__":
        # pass any two real number as dividend and divisor
        main(29, 3)

问题还表明你必须“找到最快的方法”。有没有其他方法可以更快地解决问题?

1 个答案:

答案 0 :(得分:1)

我不打算为你编写代码,但快速执行此操作的方法是使用2的幂,只使用加法和减法运算符。让我们以973/47为例。首先建立一个2倍于除数的幂表;你可以通过简单的添加来做到这一点:

1:  47
2:  94
4:  188
8:  376
16: 752
32: 1504

2的每个幂都只是2的前一个幂。当2的幂超过被除数时停止。现在向后工作,如果它小于剩余股息,则减去2的幂:

16: 973 - 752 = 221
4:  221 - 188 = 33

因此,商为16 + 4 = 20,其余为33。

此算法类似于乘法的农民算法,我在my blog讨论。