29. Divide Two Integers
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, which means losing its fractional part. For example, truncate(8.345) = 8
and truncate(-2.7335) = -2
.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Explanation: 10/3 = truncate(3.33333..) = 3.
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Explanation: 7/-3 = truncate(-2.33333..) = -2.
Note:
Both dividend and divisor will be 32-bit signed integers.
The divisor will never be 0.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.
Solution
int的大小 : 32 bit --> -2^31 ~ 2^31 -1
overflow的時候要回傳integer的最大值, 只會有一個corner case divident = -2^31 divisor = -1 => ans = 2^32,overflow 其餘的用divisor<<1的方式取找出目前最能夠接受的最大商 inital input: divident:10, divisor: 3 -> 10 > 3 ==> ok -> 10 > (3<<1) ==> ok , -> 10 > (3<<2) ==> no , add 2 to count Update divisiend to 4 by 10 - 6 = 4, repeate the steps: -> 4 > 3 ==> ok -> 4 > (3<<1) ==> no, add 1 to count
the count is what we want
public int divide(int dividend, int divisor) {
if(Integer.MIN_VALUE == dividend && divisor == -1 ){
return Integer.MAX_VALUE;
}
int a = Math.abs(dividend);
int b = Math.abs(divisor);
int res = 0;
while(a - b >= 0){
int x = 0;
while( a - (b << x << 1) >= 0){
x++;
}
//for (x = 0; a - (b << x << 1) >= 0; x++);
res += (1 << x);
a = a - (b << x);
}
return (dividend > 0) == (divisor > 0)? res : -res;
}
Last updated
Was this helpful?