我正在关注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)
问题还表明你必须“找到最快的方法”。有没有其他方法可以更快地解决问题?
答案 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讨论。