Given two integers dividend
and divisor
, divide two integers without using multiplication, division, and mod operator.
The integer division should truncate toward zero, which means losing its fractional part. For example, 8.345
would be truncated to 8
, and -2.7335
would be truncated to -2
.
Return the quotient after dividing dividend
by divisor
.
Note: Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [−231, 231 − 1]
. For this problem, if the quotient is strictly greater than 231 - 1
, then return 231 - 1
, and if the quotient is strictly less than -231
, then return -231
.
Example 1:
Input: dividend = 10, divisor = 3 Output: 3 Explanation: 10/3 = 3.33333.. which is truncated to 3.
Example 2:
Input: dividend = 7, divisor = -3 Output: -2 Explanation: 7/-3 = -2.33333.. which is truncated to -2.
Constraints:
-231 <= dividend, divisor <= 231 - 1
divisor != 0
Approach 1: Quick Power
Time complexity
class Solution:
def divide(self, a: int, b: int) -> int:
INT_MAX = (1 << 31) - 1
INT_MIN = -(1 << 31)
sign = -1 if a * b < 0 else 1
a = abs(a)
b = abs(b)
tot = 0
while a >= b:
cnt = 0
while a >= (b << (cnt + 1)):
cnt += 1
tot += 1 << cnt
a -= b << cnt
return sign * tot if INT_MIN <= sign * tot <= INT_MAX else INT_MAX
class Solution {
public int divide(int a, int b) {
int sign = 1;
if ((a < 0) != (b < 0)) {
sign = -1;
}
long x = Math.abs((long) a);
long y = Math.abs((long) b);
long tot = 0;
while (x >= y) {
int cnt = 0;
while (x >= (y << (cnt + 1))) {
cnt++;
}
tot += 1L << cnt;
x -= y << cnt;
}
long ans = sign * tot;
if (ans >= Integer.MIN_VALUE && ans <= Integer.MAX_VALUE) {
return (int) ans;
}
return Integer.MAX_VALUE;
}
}
func divide(a int, b int) int {
sign, ans, INT32_MAX, INT32_MIN, LIMIT := false, 0, 1<<31-1, -1<<31, -1<<31/2
if (a > 0 && b < 0) || (a < 0 && b > 0) {
sign = true
}
a, b = convert(a), convert(b)
for a <= b {
cnt := 0
// (b<<cnt) >= LIMIT 是为了避免 b<<(cnt+1) 发生溢出
for (b<<cnt) >= LIMIT && a <= (b<<(cnt+1)) {
cnt++
}
ans = ans + -1<<cnt
a = a - b<<cnt
}
if sign {
return ans
}
if ans == INT32_MIN {
return INT32_MAX
}
return -ans
}
func convert(v int) int {
if v > 0 {
return -v
}
return v
}
class Solution {
public:
int divide(int a, int b) {
int sign = 1;
if (a < 0 ^ b < 0) {
sign = -1;
}
auto x = abs(static_cast<long long>(a));
auto y = abs(static_cast<long long>(b));
auto tot = 0ll;
while (x >= y) {
int cnt = 0;
while (x >= (y << (cnt + 1))) {
++cnt;
}
tot += 1ll << cnt;
x -= y << cnt;
}
auto ans = sign * tot;
if (ans >= INT32_MIN && ans <= INT32_MAX) {
return static_cast<int>(ans);
}
return INT32_MAX;
}
};