/
main.go
60 lines (50 loc) · 1.06 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// source: https://leetcode.com/problems/divide-two-integers/
/*
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
*/
package main
import (
"math"
"github.com/kirk91/leetcode/assert"
)
func divide(dividend int, divisor int) int {
if divisor == 0 {
return math.MaxInt64
}
if dividend == 0 {
return 0
}
sign := 1
if (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0) {
sign = -1
}
if dividend < 0 {
dividend = -dividend
}
if divisor < 0 {
divisor = -divisor
}
var result int
for dividend >= divisor {
var shift uint
for dividend >= divisor<<shift {
shift++
}
dividend -= divisor << (shift - 1)
result += 1 << (shift - 1)
}
if sign == -1 {
return -result
}
return result
}
func main() {
assert.MustEqual(math.MaxInt64, divide(10, 0))
assert.MustEqual(3, divide(9, 3))
assert.MustEqual(3, divide(10, 3))
assert.MustEqual(4, divide(12, 3))
assert.MustEqual(1, divide(-1, -1))
assert.MustEqual(1, divide(-1, -1))
assert.MustEqual(-5, divide(10, -2))
}