Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example
Ignored Cases
-
overflow
-
time limitation
Important note
- In java, digit << 1 means multiple the digit by 2, while digit >> 1 means divide the digit by 2.
Solution 1
class Solution {
public int divide(int dividend, int divisor) {
// if dividend = Integer.MIN_VALUE && divisor = -1, the result will overflow.
if(dividend == Integer.MIN_VALUE && divisor == -1)
return Integer.MAX_VALUE;
boolean neg = false;
if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
neg = true;
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
int res = 0;
while(a >= b) {
int quo = 1;
long t = b;
while(a >= (t<<1)) {
quo = quo<<1;
t = t<<1;
}
res += quo;
a -= t;
}
if(neg)
res = -res;
return res;
}
}
Solution 2
class Solution {
public int divide(int dividend, int divisor) {
// if dividend = Integer.MIN_VALUE && divisor = -1, the result will overflow.
if(dividend == Integer.MIN_VALUE && divisor == -1)
return Integer.MAX_VALUE;
boolean neg = false;
if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
neg = true;
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
int res = 0;
while(a >= b) {
int quo = 0;
long t = b;
while(a >= (t<<quo)) {
++quo;
}
res += 1<<(quo-1);
a -= b<<(quo-1);
}
if(neg)
res = -res;
return res;
}
}
Reference