Skip to content

Commit 808fe0b

Browse files
committed
29. Divide Two Integers
```Solution.c int divide(int dividend, int divisor) { if (dividend == INT_MIN && divisor == -1) return INT_MAX; if (dividend == INT_MIN && divisor == 1) return INT_MIN; long a = labs((long)dividend); long b = labs((long)divisor); long res = 0; while (a >= b) { long temp = b, multiple = 1; while ((temp << 1) <= a) { temp <<= 1; multiple <<= 1; } a -= temp; res += multiple; } return ((dividend > 0) ^ (divisor > 0)) ? -res : res; } ``` ```Solution.cpp class Solution { public: int divide(int dividend, int divisor) { if (dividend == INT_MIN && divisor == -1) return INT_MAX; if (dividend == INT_MIN && divisor == 1) return INT_MIN; long long a = labs((long long)dividend); long long b = labs((long long)divisor); long long res = 0; while (a >= b) { long long temp = b, multiple = 1; while ((temp << 1) <= a) { temp <<= 1; multiple <<= 1; } a -= temp; res += multiple; } return ((dividend > 0) ^ (divisor > 0)) ? -res : res; } }; ``` ```Solution.cs public class Solution { public int Divide(int dividend, int divisor) { if (dividend == int.MinValue && divisor == -1) return int.MaxValue; if (dividend == int.MinValue && divisor == 1) return int.MinValue; long a = Math.Abs((long)dividend); long b = Math.Abs((long)divisor); long res = 0; while (a >= b) { long temp = b, multiple = 1; while ((temp << 1) <= a) { temp <<= 1; multiple <<= 1; } a -= temp; res += multiple; } return ((dividend > 0) ^ (divisor > 0)) ? (int)-res : (int)res; } } ``` ```Solution.dart class Solution { int divide(int dividend, int divisor) { const intMax = 2147483647; const intMin = -2147483648; if (dividend == intMin && divisor == -1) return intMax; if (dividend == intMin && divisor == 1) return intMin; int a = dividend.abs(); int b = divisor.abs(); int res = 0; while (a >= b) { int temp = b, multiple = 1; while ((temp << 1) <= a) { temp <<= 1; multiple <<= 1; } a -= temp; res += multiple; } return ((dividend > 0) ^ (divisor > 0)) ? -res : res; } } ``` ```Solution.erl -spec divide(integer(), integer()) -> integer(). divide(Dividend, Divisor) -> IntMax = (1 bsl 31) - 1, IntMin = -(1 bsl 31), case {Dividend, Divisor} of {IntMin, -1} -> IntMax; {IntMin, 1} -> IntMin; _ -> A = abs(Dividend), B = abs(Divisor), Res = divide_loop(A, B, 0), if (Dividend > 0) xor (Divisor > 0) -> -Res; true -> Res end end. divide_loop(A, B, Res) when A < B -> Res; divide_loop(A, B, Res) -> {Temp, Multiple} = double_loop(B, A, B, 1), divide_loop(A - Temp, B, Res + Multiple). double_loop(Temp, A, TempAcc, Multiple) -> case (TempAcc bsl 1) =< A of true -> double_loop(Temp, A, TempAcc bsl 1, Multiple bsl 1); false -> {TempAcc, Multiple} end. ``` ```Solution.ex defmodule Solution do @SPEC divide(integer, integer) :: integer def divide(dividend, divisor) do int_max = 2_147_483_647 int_min = -2_147_483_648 cond do dividend == int_min and divisor == -1 -> int_max dividend == int_min and divisor == 1 -> int_min true -> a = abs(dividend) b = abs(divisor) res = loop(a, b, 0) if (dividend > 0) != (divisor > 0), do: -res, else: res end end defp loop(a, b, res) when a < b, do: res defp loop(a, b, res) do {temp, multiple} = double_loop(b, a, b, 1) loop(a - temp, b, res + multiple) end defp double_loop(_b, a, temp, multiple) when temp * 2 > a, do: {temp, multiple} defp double_loop(b, a, temp, multiple), do: double_loop(b, a, temp * 2, multiple * 2) end ``` ```Solution.go func divide(dividend int, divisor int) int { if dividend == math.MinInt32 && divisor == -1 { return math.MaxInt32 } if dividend == math.MinInt32 && divisor == 1 { return math.MinInt32 } a, b := abs(dividend), abs(divisor) res := 0 for a >= b { temp, multiple := b, 1 for (temp << 1) <= a { temp <<= 1 multiple <<= 1 } a -= temp res += multiple } if (dividend > 0) != (divisor > 0) { return -res } return res } func abs(x int) int { if x < 0 { return -x } return x } ``` ```Solution.java class Solution { public int divide(int dividend, int divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; if (dividend == Integer.MIN_VALUE && divisor == 1) return Integer.MIN_VALUE; long a = Math.abs((long) dividend); long b = Math.abs((long) divisor); long res = 0; while (a >= b) { long temp = b, multiple = 1; while ((temp << 1) <= a) { temp <<= 1; multiple <<= 1; } a -= temp; res += multiple; } return ((dividend > 0) ^ (divisor > 0)) ? (int)-res : (int)res; } } ``` ```Solution.js /** * @param {number} dividend * @param {number} divisor * @return {number} */ var divide = function(dividend, divisor) { const INT_MAX = 2 ** 31 - 1; const INT_MIN = -(2 ** 31); if (divisor === 0) return INT_MAX; if (dividend === INT_MIN && divisor === -1) return INT_MAX; if (dividend === INT_MIN && divisor === 1) return INT_MIN; let a = Math.abs(dividend); let b = Math.abs(divisor); let res = 0; while (a >= b) { let temp = b, multiple = 1; while (temp + temp <= a) { temp += temp; multiple += multiple; } a -= temp; res += multiple; } const negative = (dividend < 0) !== (divisor < 0); return negative ? -res : res; }; ``` ```Solution.kt class Solution { fun divide(dividend: Int, divisor: Int): Int { if (dividend == Int.MIN_VALUE && divisor == -1) return Int.MAX_VALUE var a = dividend.toLong() var b = divisor.toLong() val negative = (a < 0) xor (b < 0) a = kotlin.math.abs(a) b = kotlin.math.abs(b) var result = 0L for (i in 31 downTo 0) { if ((a shr i) >= b) { result += 1L shl i a -= b shl i } } if (negative) result = -result if (result > Int.MAX_VALUE) return Int.MAX_VALUE if (result < Int.MIN_VALUE) return Int.MIN_VALUE return result.toInt() } } ``` ```Solution.php class Solution { /** * @param Integer $dividend * @param Integer $divisor * @return Integer */ function divide($dividend, $divisor) { $INT_MAX = 2 ** 31 - 1; $INT_MIN = -(2 ** 31); if ($dividend == $INT_MIN && $divisor == -1) return $INT_MAX; if ($dividend == $INT_MIN && $divisor == 1) return $INT_MIN; $a = abs($dividend); $b = abs($divisor); $res = 0; while ($a >= $b) { $temp = $b; $multiple = 1; while (($temp << 1) <= $a) { $temp <<= 1; $multiple <<= 1; } $a -= $temp; $res += $multiple; } return (($dividend > 0) ^ ($divisor > 0)) ? -$res : $res; } } ``` ```Solution.py class Solution: def divide(self, dividend: int, divisor: int) -> int: INT_MAX, INT_MIN = 2**31 - 1, -2**31 if dividend == INT_MIN and divisor == -1: return INT_MAX if dividend == INT_MIN and divisor == 1: return INT_MIN a, b = abs(dividend), abs(divisor) res = 0 while a >= b: temp, multiple = b, 1 while (temp << 1) <= a: temp <<= 1 multiple <<= 1 a -= temp res += multiple return -res if (dividend > 0) ^ (divisor > 0) else res ``` ```Solution.rb # @param {Integer} dividend # @param {Integer} divisor # @return {Integer} def divide(dividend, divisor) int_max = (2**31) - 1 int_min = -(2**31) return int_max if dividend == int_min && divisor == -1 return int_min if dividend == int_min && divisor == 1 a, b = dividend.abs, divisor.abs res = 0 while a >= b temp, multiple = b, 1 while (temp << 1) <= a temp <<= 1 multiple <<= 1 end a -= temp res += multiple end (dividend > 0) ^ (divisor > 0) ? -res : res end ``` ```Solution.rkt (define (divide dividend divisor) (define INT_MAX (- (expt 2 31) 1)) (define INT_MIN (- (expt 2 31))) (cond [(and (= dividend INT_MIN) (= divisor -1)) INT_MAX] [(and (= dividend INT_MIN) (= divisor 1)) INT_MIN] [else (let loop ((a (abs dividend)) (b (abs divisor)) (res 0)) (if (< a b) (if (xor (> dividend 0) (> divisor 0)) (- res) res) (let loop2 ((temp b) (multiple 1)) (if (<= (* 2 temp) a) (loop2 (* 2 temp) (* 2 multiple)) (loop (- a temp) b (+ res multiple))))))])) ``` ```Solution.rs impl Solution { pub fn divide(dividend: i32, divisor: i32) -> i32 { if dividend == i32::MIN && divisor == -1 { return i32::MAX; } if dividend == i32::MIN && divisor == 1 { return i32::MIN; } let mut a = (dividend as i64).abs(); let b = (divisor as i64).abs(); let mut res = 0i64; while a >= b { let mut temp = b; let mut multiple = 1i64; while (temp << 1) <= a { temp <<= 1; multiple <<= 1; } a -= temp; res += multiple; } if (dividend > 0) ^ (divisor > 0) { -res as i32 } else { res as i32 } } } ``` ```Solution.scala object Solution { def divide(dividend: Int, divisor: Int): Int = { val INT_MAX = Int.MaxValue val INT_MIN = Int.MinValue if (dividend == INT_MIN && divisor == -1) return INT_MAX if (dividend == INT_MIN && divisor == 1) return INT_MIN var a = Math.abs(dividend.toLong) var b = Math.abs(divisor.toLong) var res = 0L while (a >= b) { var temp = b var multiple = 1L while ((temp << 1) <= a) { temp <<= 1 multiple <<= 1 } a -= temp res += multiple } if ((dividend > 0) ^ (divisor > 0)) -res.toInt else res.toInt } } ``` ```Solution.swift class Solution { func divide(_ dividend: Int, _ divisor: Int) -> Int { let INT_MAX = 2_147_483_647 let INT_MIN = -2_147_483_648 if dividend == INT_MIN && divisor == -1 { return INT_MAX } if dividend == INT_MIN && divisor == 1 { return INT_MIN } let negative = (dividend > 0) != (divisor > 0) var a = abs(dividend) var b = abs(divisor) var res = 0 while a >= b { var temp = b var multiple = 1 while a >= temp + temp { temp += temp multiple += multiple } a -= temp res += multiple } return negative ? -res : res } } ``` ```Solution.ts function divide(dividend: number, divisor: number): number { const INT_MAX = 2 ** 31 - 1; const INT_MIN = -(2 ** 31); if (dividend === INT_MIN && divisor === -1) return INT_MAX; if (dividend === INT_MIN && divisor === 1) return INT_MIN; const negative = (dividend > 0) !== (divisor > 0); let a = Math.abs(dividend); let b = Math.abs(divisor); let res = 0; while (a >= b) { let temp = b; let multiple = 1; while (a >= temp + temp) { temp += temp; multiple += multiple; } a -= temp; res += multiple; } return negative ? -res : res; } ```
1 parent b3e8f5d commit 808fe0b

19 files changed

+419
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# [**29. Divide Two Integers**](https://leetcode.com/problems/divide-two-integers/description/)
2+
3+
Given two integers `dividend` and `divisor`, divide two integers **without** using multiplication, division, and mod operator.
4+
5+
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`.
6+
7+
Return the **quotient** after dividing `dividend` by `divisor`.
8+
9+
**Note:** Assume we are dealing with an environment that could only store integers within the **32-bit** signed integer range: `[−2³¹, 2³¹ − 1]`. For this problem, if the quotient is **strictly greater than** `2³¹ - 1`, then return `2³¹ - 1`, and if the quotient is **strictly less than** `-2³¹`, then return `-2³¹`.
10+
11+
#### **Example 1:**
12+
```md
13+
Input: dividend = 10, divisor = 3
14+
Output: 3
15+
Explanation: 10/3 = 3.33333.. which is truncated to 3.
16+
```
17+
18+
#### **Example 2:**
19+
```md
20+
Input: dividend = 7, divisor = -3
21+
Output: -2
22+
Explanation: 7/-3 = -2.33333.. which is truncated to -2.
23+
```
24+
25+
#### **Constraints:**
26+
> - `-2³¹ <= dividend, divisor <= 2³¹ - 1`
27+
> - `divisor != 0`
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
int divide(int dividend, int divisor) {
2+
if (dividend == INT_MIN && divisor == -1) return INT_MAX;
3+
if (dividend == INT_MIN && divisor == 1) return INT_MIN;
4+
long a = labs((long)dividend);
5+
long b = labs((long)divisor);
6+
long res = 0;
7+
while (a >= b) {
8+
long temp = b, multiple = 1;
9+
while ((temp << 1) <= a) {
10+
temp <<= 1;
11+
multiple <<= 1;
12+
}
13+
a -= temp;
14+
res += multiple;
15+
}
16+
return ((dividend > 0) ^ (divisor > 0)) ? -res : res;
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int divide(int dividend, int divisor) {
4+
if (dividend == INT_MIN && divisor == -1) return INT_MAX;
5+
if (dividend == INT_MIN && divisor == 1) return INT_MIN;
6+
long long a = labs((long long)dividend);
7+
long long b = labs((long long)divisor);
8+
long long res = 0;
9+
while (a >= b) {
10+
long long temp = b, multiple = 1;
11+
while ((temp << 1) <= a) {
12+
temp <<= 1;
13+
multiple <<= 1;
14+
}
15+
a -= temp;
16+
res += multiple;
17+
}
18+
return ((dividend > 0) ^ (divisor > 0)) ? -res : res;
19+
}
20+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
public class Solution {
2+
public int Divide(int dividend, int divisor) {
3+
if (dividend == int.MinValue && divisor == -1) return int.MaxValue;
4+
if (dividend == int.MinValue && divisor == 1) return int.MinValue;
5+
long a = Math.Abs((long)dividend);
6+
long b = Math.Abs((long)divisor);
7+
long res = 0;
8+
while (a >= b) {
9+
long temp = b, multiple = 1;
10+
while ((temp << 1) <= a) {
11+
temp <<= 1;
12+
multiple <<= 1;
13+
}
14+
a -= temp;
15+
res += multiple;
16+
}
17+
return ((dividend > 0) ^ (divisor > 0)) ? (int)-res : (int)res;
18+
}
19+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
int divide(int dividend, int divisor) {
3+
const intMax = 2147483647;
4+
const intMin = -2147483648;
5+
if (dividend == intMin && divisor == -1) return intMax;
6+
if (dividend == intMin && divisor == 1) return intMin;
7+
int a = dividend.abs();
8+
int b = divisor.abs();
9+
int res = 0;
10+
while (a >= b) {
11+
int temp = b, multiple = 1;
12+
while ((temp << 1) <= a) {
13+
temp <<= 1;
14+
multiple <<= 1;
15+
}
16+
a -= temp;
17+
res += multiple;
18+
}
19+
return ((dividend > 0) ^ (divisor > 0)) ? -res : res;
20+
}
21+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
-spec divide(integer(), integer()) -> integer().
2+
divide(Dividend, Divisor) ->
3+
IntMax = (1 bsl 31) - 1,
4+
IntMin = -(1 bsl 31),
5+
case {Dividend, Divisor} of
6+
{IntMin, -1} -> IntMax;
7+
{IntMin, 1} -> IntMin;
8+
_ ->
9+
A = abs(Dividend),
10+
B = abs(Divisor),
11+
Res = divide_loop(A, B, 0),
12+
if (Dividend > 0) xor (Divisor > 0) -> -Res;
13+
true -> Res
14+
end
15+
end.
16+
divide_loop(A, B, Res) when A < B -> Res;
17+
divide_loop(A, B, Res) ->
18+
{Temp, Multiple} = double_loop(B, A, B, 1),
19+
divide_loop(A - Temp, B, Res + Multiple).
20+
21+
double_loop(Temp, A, TempAcc, Multiple) ->
22+
case (TempAcc bsl 1) =< A of
23+
true -> double_loop(Temp, A, TempAcc bsl 1, Multiple bsl 1);
24+
false -> {TempAcc, Multiple}
25+
end.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule Solution do
2+
@spec divide(integer, integer) :: integer
3+
def divide(dividend, divisor) do
4+
int_max = 2_147_483_647
5+
int_min = -2_147_483_648
6+
cond do
7+
dividend == int_min and divisor == -1 -> int_max
8+
dividend == int_min and divisor == 1 -> int_min
9+
true ->
10+
a = abs(dividend)
11+
b = abs(divisor)
12+
res = loop(a, b, 0)
13+
if (dividend > 0) != (divisor > 0), do: -res, else: res
14+
end
15+
end
16+
defp loop(a, b, res) when a < b, do: res
17+
defp loop(a, b, res) do
18+
{temp, multiple} = double_loop(b, a, b, 1)
19+
loop(a - temp, b, res + multiple)
20+
end
21+
defp double_loop(_b, a, temp, multiple) when temp * 2 > a, do: {temp, multiple}
22+
defp double_loop(b, a, temp, multiple), do: double_loop(b, a, temp * 2, multiple * 2)
23+
end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
func divide(dividend int, divisor int) int {
2+
if dividend == math.MinInt32 && divisor == -1 {
3+
return math.MaxInt32
4+
}
5+
if dividend == math.MinInt32 && divisor == 1 {
6+
return math.MinInt32
7+
}
8+
a, b := abs(dividend), abs(divisor)
9+
res := 0
10+
for a >= b {
11+
temp, multiple := b, 1
12+
for (temp << 1) <= a {
13+
temp <<= 1
14+
multiple <<= 1
15+
}
16+
a -= temp
17+
res += multiple
18+
}
19+
if (dividend > 0) != (divisor > 0) {
20+
return -res
21+
}
22+
return res
23+
}
24+
func abs(x int) int {
25+
if x < 0 {
26+
return -x
27+
}
28+
return x
29+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int divide(int dividend, int divisor) {
3+
if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
4+
if (dividend == Integer.MIN_VALUE && divisor == 1) return Integer.MIN_VALUE;
5+
long a = Math.abs((long) dividend);
6+
long b = Math.abs((long) divisor);
7+
long res = 0;
8+
while (a >= b) {
9+
long temp = b, multiple = 1;
10+
while ((temp << 1) <= a) {
11+
temp <<= 1;
12+
multiple <<= 1;
13+
}
14+
a -= temp;
15+
res += multiple;
16+
}
17+
return ((dividend > 0) ^ (divisor > 0)) ? (int)-res : (int)res;
18+
}
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @param {number} dividend
3+
* @param {number} divisor
4+
* @return {number}
5+
*/
6+
var divide = function(dividend, divisor) {
7+
const INT_MAX = 2 ** 31 - 1;
8+
const INT_MIN = -(2 ** 31);
9+
if (divisor === 0) return INT_MAX;
10+
if (dividend === INT_MIN && divisor === -1) return INT_MAX;
11+
if (dividend === INT_MIN && divisor === 1) return INT_MIN;
12+
let a = Math.abs(dividend);
13+
let b = Math.abs(divisor);
14+
let res = 0;
15+
while (a >= b) {
16+
let temp = b, multiple = 1;
17+
while (temp + temp <= a) {
18+
temp += temp;
19+
multiple += multiple;
20+
}
21+
a -= temp;
22+
res += multiple;
23+
}
24+
const negative = (dividend < 0) !== (divisor < 0);
25+
return negative ? -res : res;
26+
};

0 commit comments

Comments
 (0)