题目:
Divide two integers without using multiplication, division and mod operator.
题解:
位运算
最简单的方法当然是直接 被除数减除数,直到为0. 这样太慢,会超时。
改进,被除数减去除数的幂次。
被除数 = 除数*2^a + 除数*2^b + ....
例如 47/7 = 7*2^2 + 7*2^1 + 5
答案就是2^2 + 2^1 = 6
那么我们就需要将divisor先左移至比dividend稍小的值,
然后dividend减去divisor(此时dividend比divisor小)
右移divisor(减小),直至比dividend小,
dividend减去divisor。
循环往复,直至dividend为0
其中,记录2的幂次的变量,需要和divisor共进退(同时左移/右移)
Code:
class Solution:
# @return an integer
def divide(self, dividend, divisor):
if divisor == 1:
return dividend
if divisor == -1:
return -dividend
flag = True
if divisor < 0:
divisor = -divisor
flag = not flag
if dividend < 0:
dividend = -dividend
flag = not flag
if divisor > dividend:
return 0
ans = 0
i = 1
k = divisor
while k+k < dividend :
k = k << 1
i = i << 1
dividend -= k
ans += i
while dividend > 0:
while k > dividend:
k = k >> 1
i = i >> 1
dividend -= k
ans += i
if not flag:
ans = -ans
return ans