标签:
Problem Definition:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Solution:就是要用加减和位操作之类的运算,来实现除法咯。
6/3=2的意思是,6里面包含了2个3。因为我们要做的,就是算出被除数dividend中包含了几个除数divisor。
最直接的想法:不断从dividend里减去divisor,直到dividend小于了divisor,用一个计数变量来统计一共完成了多少次减操作,得到的就是商。
存在的问题:
1)如果除数相对于被除数来说很小,就要进行好多次以上这种运算,很耗时。比如被除数是2147483647,而除数是1...;
2)要考虑符号问题,比如 -3 / 2,并不能直接使用上面的规则;
3)要处理overflow.
那么来解决上面的问题 one by one。
1)借用二分查找的思想,不断扩大(翻倍)divisor,这样能使得减的次数减少很多很多。翻倍可以靠左移操作来实现。注意计数变量增大的跨度也应该跟着翻倍
2)先确定符号,然后用两数的绝对值继续操作。最后再还原符号。
3)限定边界
代码:
1 # @param {integer} dividend 2 # @param {integer} divisor 3 # @return {integer} 4 def divide(self, dividend, divisor): 5 pz=(dividend<0)==(divisor<0) 6 dividend, divisor=abs(dividend), abs(divisor) 7 result=0 8 9 while dividend>=divisor: 10 subDvz, cnt=divisor, 1 11 while dividend>=subDvz: 12 dividend-=subDvz 13 result+=cnt 14 subDvz<<=1 15 cnt<<=1 16 if not pz: #negative 17 result=-result 18 return min(max(-2147483648, result), 2147483647)
注:以上代码通过了OJ,但是其对除法操作的定义似乎跟Python不一致。用Python算-3/2,结果是-2,而以上代码会返回-1。Python采用的是向下(数轴负方向)取整。而本题定义的应当是向零取整。
LeetCode#29 Divide Two Integers
标签:
原文地址:http://www.cnblogs.com/acetseng/p/4694624.html