Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
90 lines (75 loc) · 2.72 KB

File metadata and controls

90 lines (75 loc) · 2.72 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package Algorithms.binarySearch;
public class Divide {
public static void main(String[] strs) {
System.out.println(divide(-2147483648, -1));
}
public int divide1(int dividend, int divisor) {
long a = Math.abs((long)dividend);
// ref : http://blog.csdn.net/kenden23/article/details/16986763
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
long b = Math.abs((long)divisor);
int ret = 0;
// 这里必须是= 因为相等时也可以减
while (a >= b) {
// 判断条件是 >=
for (long deduce = b, cnt = 1; a >= deduce; deduce <<= 1, cnt <<= 1) {
a -= deduce;
ret += cnt;
}
}
// 获取符号位。根据除数跟被除数的关系来定
return (dividend > 0) ^ (divisor > 0) ? -ret: ret;
}
public static int divide(int dividend, int divisor) {
if (divisor == 0) {
return Integer.MAX_VALUE;
}
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
long dividendTmp = Math.abs((long)dividend);
long divisorTmp = Math.abs((long)divisor);
// bug 3: ret should use Long to avoid overflow.
long ret = 0;
// bug 2: should use dividentTmp > divisor as the while judge.
while (dividendTmp >= divisorTmp) {
// bug 1: should use Long for tmp.
long tmp = divisorTmp;
int rst = 1;
while(tmp <= dividendTmp) {
// bug 3: the two statement should inside the while LOOP.
ret += rst;
dividendTmp -= tmp;
tmp <<= 1;
rst <<= 1;
}
}
// bug 4: out of range:
/*
Input: -2147483648, -1
Output: -2147483648
Expected: 2147483647
*/
//ret = ((dividend > 0) ^ (divisor > 0)) ? -ret: ret;
ret = ((((dividend ^ divisor) >> 31) & 1) == 1) ? -ret: ret;
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
} else {
return (int)ret;
}
}
public int divide3(int dividend, int divisor) {
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
long ret = 0;
while (a >= b) {
for (long tmp = b, cnt = 1; a >= tmp; tmp <<= 1, cnt <<= 1) {
ret += cnt;
a -= tmp;
}
}
ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret;
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return (int)ret;
}
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.