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