[LeetCode]29、兩數相除

題目描述

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。

返回被除數 dividend 除以除數 divisor 得到的商。

示例 1:

輸入: dividend = 10, divisor = 3
輸出: 3
示例 2:

輸入: dividend = 7, divisor = -3
輸出: -2
說明:

被除數和除數均為 32 位有符號整數。
除數不為 0。
假設我們的環境只能存儲 32 位有符號整數,其數值范圍是 [?231, 231 ? 1]。本題中,如果除法結果溢出,則返回 231 ? 1。

思路解析

非常簡單的思路就是除數-被除數的次數,有多少就是多少
但是會出現一個問題,就是被除數很小,除數很大,時間復雜過高,利用位運算加速。
被除數每次翻倍,結果也翻倍
當不能翻倍的時候,回歸開始,重復計算

class Solution:

    def divide(self, a, b):
        '''
        正負號
        越界
        =0
        :param a:
        :param b:
        :return:
        '''
        sign = 1 if a ^ b >= 0 else -1
        a = abs(a)
        b = abs(b)
        if b == 0 or a < b:
            return 0
        res = 0
        while a >= b:
            temp, add = b, 1
            while a >= temp:
                a -= temp
                res += add
                add <<= 1
                temp <<= 1
        res *= sign

        if res > 2 ** 31 - 1:
            return 2 ** 31 - 1
        if res < -2 ** 31:
            return -2 ** 31
        return res
AC29
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容