29.?兩數(shù)相除
給定兩個整數(shù)臭笆,被除數(shù) dividend 和除數(shù) divisor根资。將兩數(shù)相除胎撇,要求不使用乘法狸捕、除法和 mod 運算符。
返回被除數(shù) dividend 除以除數(shù) divisor 得到的商乐设。
示例 1:
輸入: dividend = 10, divisor = 3
輸出: 3
示例 2:
輸入: dividend = 7, divisor = -3
輸出: -2
說明:
被除數(shù)和除數(shù)均為 32 位有符號整數(shù)讼庇。
除數(shù)不為 0。
假設(shè)我們的環(huán)境只能存儲 32 位有符號整數(shù)伤提,其數(shù)值范圍是 [?231,? 231 ? 1]巫俺。本題中认烁,如果除法結(jié)果溢出肿男,則返回 231 ? 1。
解題思路:
? ? ? ? 如果按照常規(guī)的 循環(huán)減去 除數(shù) divisor 會產(chǎn)生時間溢出却嗡, 換個思路每相減一次 除數(shù) divisor 就 加上自己 第二次相減 就變成 - 2*divisor 第三次就變成 - 3*divisor 當最后一次 相減的余數(shù) 小于 n*divisor舶沛,再開始一個新循環(huán) 從 n*divisor ~ 0,查找 相減余數(shù) 的 值
代碼:
class Solution:
? ? def divide(self, dividend, divisor):
? ? ? ? """
? ? ? ? :type dividend: int
? ? ? ? :type divisor: int
? ? ? ? :rtype: int
? ? ? ? """
? ? ? ? min = (2**31)
? ? ? ? isActive = True
? ? ? ? if (divisor<0 and dividend>0) or (divisor>0 and dividend<0):
? ? ? ? ? ? isActive = False
? ? ? ? dividend = abs(dividend)
? ? ? ? divisor = abs(divisor)
? ? ? ? i = 0
? ? ? ? j = 1
? ? ? ? divisor_j = divisor
? ? ? ? result = dividend
? ? ? ? while result >= divisor_j:
? ? ? ? ? ? result = result-divisor_j
? ? ? ? ? ? divisor_j += divisor
? ? ? ? ? ? i+=j
? ? ? ? ? ? j+=1
? ? ? ? while result >= divisor:
? ? ? ? ? ? result = result-divisor
? ? ? ? ? ? divisor_j += divisor
? ? ? ? ? ? i+=1
? ? ? ? if not isActive:
? ? ? ? ? ? i = -i
? ? ? ? if i < -min:
? ? ? ? ? ? return i-1
? ? ? ? if i > min-1:
? ? ? ? ? ? return i-1
? ? ? ? return i