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 b5f5e6a

Browse files
Merge pull request #51 from Mrzhudky/work
Add Solution 029[Java]
2 parents e8fa938 + 7b619be commit b5f5e6a

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
## 两数相除
2+
### 题目描述
3+
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
4+
5+
返回被除数 dividend 除以除数 divisor 得到的商。
6+
7+
示例 1:
8+
9+
输入: dividend = 10, divisor = 3
10+
输出: 3
11+
12+
示例 2:
13+
14+
输入: dividend = 7, divisor = -3
15+
输出: -2
16+
17+
说明:
18+
19+
被除数和除数均为 32 位有符号整数。
20+
除数不为 0。
21+
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31 , 2^31 − 1]
22+
本题中,如果除法结果溢出,则返回 2^31 − 1。
23+
24+
### 解法
25+
1. 考虑用位运算来代替乘除,用二进制表示商,则只要确定了每一个二进制位,则把这些位加和即可得到商;
26+
2. 对除数进行移位,找到最高位,然后从高到低依次比较每一位对应的数与除数的乘积,若大于则说明商的该位为1,否则为0;
27+
28+
```java
29+
class Solution {
30+
public int divide(int dividend, int divisor) {
31+
if(dividend == 0 || divisor == 1) {
32+
return dividend;
33+
}
34+
if(divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)) {
35+
return Integer.MAX_VALUE;
36+
}
37+
// 商的符号,true 为正,false 为负
38+
boolean flag = true;
39+
if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
40+
flag = false;
41+
}
42+
long dividendLong = Math.abs((long)dividend);
43+
long divisorLong = Math.abs((long)divisor);
44+
45+
int re = 0;
46+
long factor = 0x1;
47+
48+
while (dividendLong >= (divisorLong << 1)) {
49+
divisorLong <<= 1;
50+
factor <<= 1;
51+
}
52+
53+
while (factor > 0 && dividendLong > 0) {
54+
if(dividendLong >= divisorLong) {
55+
dividendLong -= divisorLong;
56+
re += factor;
57+
}
58+
factor >>>= 1;
59+
divisorLong >>>= 1;
60+
}
61+
62+
return flag ? re : -re;
63+
}
64+
}
65+
```
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
public int divide(int dividend, int divisor) {
3+
if(dividend == 0 || divisor == 1) {
4+
return dividend;
5+
}
6+
if(divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)) {
7+
return Integer.MAX_VALUE;
8+
}
9+
// 商的符号,true 为正,false 为负
10+
boolean flag = true;
11+
if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
12+
flag = false;
13+
}
14+
long dividendLong = Math.abs((long)dividend);
15+
long divisorLong = Math.abs((long)divisor);
16+
17+
int re = 0;
18+
long factor = 0x1;
19+
20+
while (dividendLong >= (divisorLong << 1)) {
21+
divisorLong <<= 1;
22+
factor <<= 1;
23+
}
24+
25+
while (factor > 0 && dividendLong > 0) {
26+
if(dividendLong >= divisorLong) {
27+
dividendLong -= divisorLong;
28+
re += factor;
29+
}
30+
factor >>>= 1;
31+
divisorLong >>>= 1;
32+
}
33+
34+
return flag ? re : -re;
35+
}
36+
}

0 commit comments

Comments
(0)

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