原题链接
https://leetcode.com/problems/divide-two-integers/
解题思路
除法的本质是减法,但是如果此题采用被除数不断减去除数的方法,对于被除数很大而除数很小的情况,会产生RunTimeError;因此考虑移位算法,使除数以的指数倍增长,提高计算效率。除此以外还需要注意两点:一是符号的判断,二是溢出。
代码
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
# sign flag
isPos = True
if (dividend >= 0 and divisor < 0) or (dividend <= 0 and divisor > 0):
isPos = False
dividend = abs(dividend)
divisor = abs(divisor)
if dividend < divisor:
return 0
ans = 0
while dividend - divisor >= 0:
result, dividend = self.increaseAnswer(dividend, divisor)
ans += result
if isPos == False:
if ans < -2147483648:
return -2147483648
return -ans
elif ans > 2147483647:
return 2147483647
return ans
def increaseAnswer(self, dividend, divisor):
result = 1
while dividend - divisor >= 0:
result <<= 1
divisor <<= 1
result >>= 1
divisor >>=1
return result, dividend-divisor
参考:https://www.cnblogs.com/zuoyuan/p/3779359.html