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