https://leetcode.com/problems/divide-two-integers/
需要知道的知识:
Without using the *, /, and % operator, what we can use is +,-, and <<, >> .<<1 is to multiply 2,e.g. 2<<1 = 4;>>1 is to divide 2 e.g. 8>>1 = 4;
思路:
常规思路就是用dividend 不断的减去divisor,直到dividend为0. 但是这样太慢,所以我们可以dividend 减去 divisor的2倍,4倍,8倍。。。直到dividend < divisor*2的幂,这个时候dividend还剩下一部分,可能很大,也可能很小,然后再看这剩下的部分除以divisor是多少。于是又继续除以原来的divisor的2倍,4倍,8倍,循环到dividend小于原来的divisor。
参考:http://chaoren.is-programmer.com/posts/43017.html
http://jelices.blogspot.hk/2014/05/leetcode-python-divide-integer.html
http://yucoding.blogspot.hk/2013/01/leetcode-question-28-divide-two-integers.html
所以有两层while循环,一层就是剩下的dividend >= 原来的divisor。下一层就是每次用divisor的2幂倍数减。
这里注意判断越界!!!!!!!!
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
sign = (dividend < 0 and divisor > 0) or (dividend > 0 and divisor < 0)
a, b = abs(dividend), abs(divisor)
ret, c = 0, 0
while a >= b:
c = b
i = 0
while a >= c:
a -= c
ret += (1<<i)
i += 1
c <<= 1
if sign:
ret = -ret
return min(max(-2147483648, ret), 2147483647)#判断越界