29. 兩數(shù)相除

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 當(dāng)最后一次 相減的余數(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


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容