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

Sign up
Appearance settings

Commit d631bfb

Browse files
feat: update solutions to lc/lcof2 problem: Divide Two Integers
* lcof2 No.001 * lc No.0029.Divide Two Integers
1 parent 3b6cd5a commit d631bfb

File tree

11 files changed

+408
-76
lines changed

11 files changed

+408
-76
lines changed

‎lcof2/剑指 Offer II 001. 整数除法/README.md‎

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ a = abs(a)
7272
b = abs(b)
7373
cnt = 0
7474
while a >= b:
75-
a -= b
76-
cnt += 1
75+
a -= b
76+
cnt += 1
7777
return sign * cnt
7878
```
7979

@@ -94,9 +94,8 @@ class Solution:
9494
tot = 0
9595
while a >= b:
9696
cnt = 0
97-
while a >= (b << cnt):
97+
while a >= (b << (cnt+1)):
9898
cnt += 1
99-
cnt -= 1
10099
tot += 1 << cnt
101100
a -= b << cnt
102101
return sign * tot if INT_MIN <= sign * tot <= INT_MAX else INT_MAX
@@ -118,10 +117,9 @@ class Solution {
118117
long tot = 0;
119118
while (x >= y) {
120119
int cnt = 0;
121-
while (x >= (y << cnt)) {
120+
while (x >= (y << (cnt+1))) {
122121
cnt++;
123122
}
124-
cnt--;
125123
tot += 1L << cnt;
126124
x -= y << cnt;
127125
}
@@ -156,10 +154,9 @@ func divide(a int, b int) int {
156154
tot := 0
157155
for a >= b {
158156
cnt := 0
159-
for a >= (b << cnt) {
157+
for a >= (b << (cnt + 1)) {
160158
cnt++
161159
}
162-
cnt--
163160
tot += 1 << cnt
164161
a -= b << cnt
165162
}
@@ -179,6 +176,38 @@ func abs(a int) int {
179176
}
180177
```
181178

179+
### **C++**
180+
181+
```cpp
182+
class Solution {
183+
public:
184+
int divide(int a, int b) {
185+
int sign = 1;
186+
if (a < 0 ^ b < 0) {
187+
sign = -1;
188+
}
189+
190+
auto x = abs(static_cast<long long>(a));
191+
auto y = abs(static_cast<long long>(b));
192+
auto tot = 0ll;
193+
while (x >= y) {
194+
int cnt = 0;
195+
while (x >= (y << (cnt + 1))) {
196+
++cnt;
197+
}
198+
tot += 1ll << cnt;
199+
x -= y << cnt;
200+
}
201+
202+
auto ans = sign * tot;
203+
if (ans >= INT32_MIN && ans <= INT32_MAX) {
204+
return static_cast<int>(ans);
205+
}
206+
return INT32_MAX;
207+
}
208+
};
209+
```
210+
182211
### **...**
183212

184213
```
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
int divide(int a, int b) {
4+
int sign = 1;
5+
if (a < 0 ^ b < 0) {
6+
sign = -1;
7+
}
8+
9+
auto x = abs(static_cast<long long>(a));
10+
auto y = abs(static_cast<long long>(b));
11+
auto tot = 0ll;
12+
while (x >= y) {
13+
int cnt = 0;
14+
while (x >= (y << (cnt + 1))) {
15+
++cnt;
16+
}
17+
tot += 1ll << cnt;
18+
x -= y << cnt;
19+
}
20+
21+
auto ans = sign * tot;
22+
if (ans >= INT32_MIN && ans <= INT32_MAX) {
23+
return static_cast<int>(ans);
24+
}
25+
return INT32_MAX;
26+
}
27+
};

‎lcof2/剑指 Offer II 001. 整数除法/Solution.go‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ func divide(a int, b int) int {
1010
tot := 0
1111
for a >= b {
1212
cnt := 0
13-
for a >= (b << cnt) {
13+
for a >= (b << (cnt+1)) {
1414
cnt++
1515
}
16-
cnt--
1716
tot += 1 << cnt
1817
a -= b << cnt
1918
}
@@ -30,4 +29,4 @@ func abs(a int) int {
3029
return -a
3130
}
3231
return a
33-
}
32+
}

‎lcof2/剑指 Offer II 001. 整数除法/Solution.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ public int divide(int a, int b) {
99
long tot = 0;
1010
while (x >= y) {
1111
int cnt = 0;
12-
while (x >= (y << cnt)) {
12+
while (x >= (y << (cnt + 1))) {
1313
cnt++;
1414
}
15-
cnt--;
1615
tot += 1L << cnt;
1716
x -= y << cnt;
1817
}
@@ -29,4 +28,4 @@ private long abs(long a) {
2928
}
3029
return a;
3130
}
32-
}
31+
}

‎lcof2/剑指 Offer II 001. 整数除法/Solution.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ def divide(self, a: int, b: int) -> int:
88
tot = 0
99
while a >= b:
1010
cnt = 0
11-
while a >= (b << cnt):
11+
while a >= (b << (cnt+1)):
1212
cnt += 1
13-
cnt -= 1
1413
tot += 1 << cnt
1514
a -= b << cnt
1615
return sign * tot if INT_MIN <= sign * tot <= INT_MAX else INT_MAX

‎solution/0000-0099/0029.Divide Two Integers/README.md‎

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,148 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
通过下面这段伪代码,不难理解除法本质上就是减法,但是一次循环只能做一次减法,效率太低会导致超时,所以再加上快速幂的思想优化即可
45+
46+
```py
47+
sign = -1 if a * b < 0 else 1
48+
a = abs(a)
49+
b = abs(b)
50+
cnt = 0
51+
while a >= b:
52+
a -= b
53+
cnt += 1
54+
return sign * cnt
55+
```
56+
4457
<!-- tabs:start -->
4558

4659
### **Python3**
4760

4861
<!-- 这里可写当前语言的特殊实现逻辑 -->
4962

5063
```python
51-
64+
class Solution:
65+
def divide(self, a: int, b: int) -> int:
66+
INT_MAX = (1 << 31) - 1
67+
INT_MIN = -(1 << 31)
68+
sign = -1 if a * b < 0 else 1
69+
a = abs(a)
70+
b = abs(b)
71+
tot = 0
72+
while a >= b:
73+
cnt = 0
74+
while a >= (b << (cnt + 1)):
75+
cnt += 1
76+
tot += 1 << cnt
77+
a -= b << cnt
78+
return sign * tot if INT_MIN <= sign * tot <= INT_MAX else INT_MAX
5279
```
5380

5481
### **Java**
5582

5683
<!-- 这里可写当前语言的特殊实现逻辑 -->
5784

5885
```java
86+
class Solution {
87+
public int divide(int a, int b) {
88+
int sign = 1;
89+
if ((a < 0) != (b < 0)) {
90+
sign = -1;
91+
}
92+
long x = abs(a);
93+
long y = abs(b);
94+
long tot = 0;
95+
while (x >= y) {
96+
int cnt = 0;
97+
while (x >= (y << (cnt + 1))) {
98+
cnt++;
99+
}
100+
tot += 1L << cnt;
101+
x -= y << cnt;
102+
}
103+
long ans = sign * tot;
104+
if (ans >= Integer.MIN_VALUE && ans <= Integer.MAX_VALUE) {
105+
return (int) ans;
106+
}
107+
return Integer.MAX_VALUE;
108+
}
109+
110+
private long abs(long a) {
111+
if (a < 0) {
112+
return -a;
113+
}
114+
return a;
115+
}
116+
}
117+
```
118+
119+
### **Go**
120+
121+
```go
122+
func divide(a int, b int) int {
123+
sign := 1
124+
if a*b < 0 {
125+
sign = -1
126+
}
127+
128+
a = abs(a)
129+
b = abs(b)
130+
131+
tot := 0
132+
for a >= b {
133+
cnt := 0
134+
for a >= (b << (cnt + 1)) {
135+
cnt++
136+
}
137+
tot += 1 << cnt
138+
a -= b << cnt
139+
}
140+
141+
ans := sign * tot
142+
if ans >= math.MinInt32 && ans <= math.MaxInt32 {
143+
return ans
144+
}
145+
return math.MaxInt32
146+
}
147+
148+
func abs(a int) int {
149+
if a < 0 {
150+
return -a
151+
}
152+
return a
153+
}
154+
```
59155

156+
### **C++**
157+
158+
```cpp
159+
class Solution {
160+
public:
161+
int divide(int a, int b) {
162+
int sign = 1;
163+
if (a < 0 ^ b < 0) {
164+
sign = -1;
165+
}
166+
167+
auto x = abs(static_cast<long long>(a));
168+
auto y = abs(static_cast<long long>(b));
169+
auto tot = 0ll;
170+
while (x >= y) {
171+
int cnt = 0;
172+
while (x >= (y << (cnt + 1))) {
173+
++cnt;
174+
}
175+
tot += 1ll << cnt;
176+
x -= y << cnt;
177+
}
178+
179+
auto ans = sign * tot;
180+
if (ans >= INT32_MIN && ans <= INT32_MAX) {
181+
return static_cast<int>(ans);
182+
}
183+
return INT32_MAX;
184+
}
185+
};
60186
```
61187

62188
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /