29. 两数相除





思路:

eg:11÷3

∵11>3

∴res>=1

又∵11>3+3=6

∴res>=2 (1+1)

又∵11<6+6=12

∴res<4 (2+2)

即2<=res<4

递归部分:

又11-6=5>3

∴restemp >= 1

又∵5<6 (3+3)

∴restemp<2 (1+1)

即1<=restemp<2

又∵5-3=2<3

∴restemp = 1

返回:

∴res = 2 + restemp = 2+1=3

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        if dividend == 0:
            return 0
        # 符号
        sign = 1
        if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0):
            sign = -1
        # 溢出的情况
        if abs(divisor) == 1:
            if abs(dividend) > 2 ** 31 - 1:
                return 2 ** 31 - 1 if sign > 0 else -2 ** 31
        tema = abs(dividend)
        temb = abs(divisor)
        res = self.DiGuiDiv(tema, temb)
        return res if sign > 0 else -res

    def DiGuiDiv(self, a, b):
        if a < b:
            return 0
        count = 1
        temp = b
        while (temp + temp) <= a:
            count += count
            temp += temp
        return count + self.DiGuiDiv(a - temp, b)


if __name__ == '__main__':
    solution = Solution()
    print(solution.divide(-2147483648, -1))
posted @ 2020-06-08 13:33  人间烟火地三鲜  阅读(305)  评论(0编辑  收藏  举报