File tree Expand file tree Collapse file tree 2 files changed +101
-0
lines changed
solution/029.Divide Two Integers Expand file tree Collapse file tree 2 files changed +101
-0
lines changed Original file line number Diff line number Diff line change
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
+ ```
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments