问答题 3.  如何不使用除法操作符实现两个正整数的除法?
【正确答案】方法一:减法
   主要思路为:使被除数不断减去除数,直到相减的结果小于除数为止,此时,商就为相减的次数,余数为最后相减的差。例如在计算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))。
【答案解析】

[考点] 如何不使用除法操作符实现两个正整数的除法。