題目:
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