document.write('
方法一:减法
主要思路为:使被除数不断减去除数,直到相减的结果小于除数为止,此时,商就为相减的次
数,余数为最后相减的差。例如在计算14除以4的时候,首先计算14-4=10,由于10>4,继续做减
法运算:10-4=6,6-4=2,此时2<4。由于总共进行了3次减法操作,最终相减的结果为2,因此
15除以4的商为3,余数为2。如果被除数比除数都小,那么商为0,余数为被除数。根据这个思路的
实现代码如下:
#方法功能: 计算两个自然数的除法
def divide(m,n):
print str(m)+"除以"+str(n),
res=0
remain=m
#被除数减除数, 直到相减结果小于除数为止
while m>n:
m=m-n
res+=1
remain=m
print "商为:"+str(res)+"余数:"+str(remain)
if __name__=="main__":
m=14
n=4
divide(m,n)
程序的运行结果为:
14除以4商为:3余数为:2
算法性能分析
这种方法循环的次数为m/n,因此算法的时间复杂度为O(m/n)。需要注意的是,这种方法也实现
了不用%操作符实现%运算的目的。
方法二:移位法
方法一所采用的减法操作,还可以用等价的加法操作来实现。例如在计算17除以4的时候,可以尝
试4*1,4*2(4+4),4*3(4+4+4)依次进行计算,直到计算的结果大于14的时候就可以很容易求出商
与余数。但是这种方法每次都递增4,效率较低。下面给出另外一种增加递增速度的方法:以2的指
数进行递增(取2的指数的原因是,2的指数操作可以通过移位操作来实现,有更高的效率),计算
4*1,4*2,4*4,4*8,由于4*8>17,然后接着对17-4*4=1进入下一次循环用相同的方法进行计
算。实现代码如下:
def divide(m,n):
print str(m)+"除以"+str(n),
result=0
while m>=n:
multi=1
# multi*n>m/2(即2* multi*n>m)时结束循环
while multi*n<=(m>>1):
multi<<=1
result+=multi
#相减的结果进入下次循环
m-=multi*n
print "商为:"+str(result)+"余数:"+str(m)
if __name__=="__main__":
m=14
n=4
divide(m,n)
算法性能分析:
由于这种方法采用指数级的增长方式不断逼近m/n,因此算法的时间复杂度为O(log(m/n))。
');