29. Divide Two Integers

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:

Input: dividend = 10, divisor = 3
Output: 3

Example 2:

Input: dividend = 7, divisor = -3
Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31− 1]. For the purpose of this problem, assume that your function returns 2^31− 1 when the division result overflows.

Solution

(1) Java

class Solution {
    public int divide(int dividend, int divisor) {
        int sign = dividend >= 0 && divisor > 0 ? 1 : dividend <= 0 && divisor < 0 ? 1 : -1;
        int rst = 0;
        if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        } else if (divisor == 1) {
            return dividend;
        } else if (divisor == -1) {
            return -dividend;
        }
        dividend = dividend >= 0 ? -dividend : dividend;
        divisor = divisor > 0 ? -divisor : divisor;
        while (dividend <= divisor) {
            int shift = 1;
            int divisor2 = divisor;
            while (true) {
                if (divisor2<<1 >= 0 || divisor2<<1 < dividend) {
                    rst += shift;
                    dividend -= divisor2;
                    break;
                }
                shift <<= 1;             
                divisor2 <<= 1;
            }
        }
        return sign > 0 ? rst : -rst;
    }
}

(2) Python

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        if divisor == 1:
            return dividend
        elif divisor == -1:
            if dividend == -2147483648:
                return 2147483647
            return -dividend
        sign = 1
        if (dividend < 0 and divisor > 0) or (dividend > 0 and divisor < 0):
            sign = -1
        dividend = abs(dividend)
        divisor = abs(divisor)
        rst = 0
        while dividend >= divisor:
            shift = 1
            divisor2 = divisor
            while True:
                if divisor2 << 1 > dividend:
                    rst += shift
                    dividend -= divisor2
                    break
                shift <<= 1
                divisor2 <<= 1
        if sign == 1:
            return rst
        return -rst

Another version

   def divide(self, a, b):
        sig = (a < 0) == (b < 0)
        a, b, res = abs(a), abs(b), 0
        while a >= b:
            x = 0
            while a >= b << (x + 1): x += 1
            res += 1 << x
            a -= b << x
        return min(res if sig else -res, 2147483647)

(3) Scala



results matching ""

    No results matching ""