Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
INT_MAX AND INT_MIN is not symmetric. Java abs(INT_MIN) returns INT_MIN as well. 1. Use long to solve it.
public class Solution {
public int divide(int dividend, int divisor) {
// 00100101
// 00000011
if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
int res = 0;
boolean sign = dividend > 0 ^ divisor > 0 ? false : true;
long dividendl = Math.abs((long)dividend), divisorl = Math.abs((long)divisor);
while(dividendl >= divisorl){
long k = divisorl;
int q = 1;
while((k << 1) <= dividendl){
k <<= 1;
q <<= 1;
}
res += q;
dividendl -= k;
}
if(sign)
return res;
else
return (res^-1) + 1;
}
}
2. Handle the boarder condition, when INT_MIN as dividend: dividend - divisor, ++res will solve the boarder problem.
No comments:
Post a Comment