13
13
14
14
class Solution {
15
15
public:
16
- // Solution 1. Bottom->Up
17
- int divide (int dividend, int divisor) {
18
- assert (divisor != 0 );
19
- bool flag = dividend > 0 && divisor < 0 ||
20
- dividend < 0 && divisor > 0 ;
21
- long long dividendll = abs ((long long )dividend);
22
- long long divisorll = abs ((long long )divisor);
23
- int res = 0 ;
24
- while (dividendll >= divisorll)
25
- {
26
- long long div = divisorll;
27
- int quot = 1 ;
28
- while ((div << 1 ) <= dividendll) {
29
- div <<= 1 ;
30
- quot <<= 1 ;
31
- }
32
- dividendll -= div;
33
- res += quot;
34
- }
35
- return flag ? -res : res;
36
- }
37
- // Solution 2. Top->Down
38
- int divide_2 (int dividend, int divisor) {
16
+ // Top -> Down
17
+ int divide_1 (int dividend, int divisor) {
39
18
assert (divisor != 0 );
40
- bool flag = dividend > 0 && divisor < 0 ||
41
- dividend < 0 && divisor > 0 ;
19
+ bool flag = (dividend < 0 ) ^ (divisor < 0 );
42
20
long long dividendll = abs ((long long )dividend);
43
21
long long divisorll = abs ((long long )divisor);
44
- int res = 0 ;
22
+ long long res = 0 ;
45
23
long long d = divisorll, q = 1 ;
46
24
while ((d << 1 ) <= dividendll) {
47
25
d <<= 1 ;
@@ -55,6 +33,26 @@ class Solution {
55
33
d >>= 1 ;
56
34
q >>= 1 ;
57
35
}
58
- return flag ? -res : res;
36
+ if (flag == true ) res = -res;
37
+ if (res > INT_MAX) return INT_MAX;
38
+ return res;
39
+ }
40
+ // bottom -> up
41
+ int divide (int dividend, int divisor) {
42
+ assert (divisor != 0 );
43
+ bool flag = (dividend < 0 ) ^ (divisor < 0 );
44
+ long long Dividend = abs ((long long )dividend);
45
+ long long Divisor = abs ((long long )divisor);
46
+ long long res = 0 ;
47
+ while (Dividend >= Divisor) {
48
+ long long c = Divisor;
49
+ for (int i = 0 ; (c << i) <= Dividend; ++i) {
50
+ Dividend -= (c << i);
51
+ res += (1 << i);
52
+ }
53
+ }
54
+ if (flag == true ) res = -res;
55
+ if (res > INT_MAX) return INT_MAX;
56
+ return res;
59
57
}
60
- };
58
+ };
0 commit comments