Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
?
public class Solution {
public static long divide(int dividend, int divisor) {
int sign;
int res = 0;
if (dividend<0 && divisor<0 || dividend>0 && divisor>0) {
sign = 1;
} else if (dividend == 0) {
return 0;
} else if (divisor == 0) {
throw new RuntimeException("divisor is 0");
} else if (dividend>Integer.MAX_VALUE || divisor>Integer.MAX_VALUE || dividend<Integer.MIN_VALUE || divisor<Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
else {
sign = -1;
}
long newdividend = Math.abs((long)dividend);
long newdivisor = Math.abs((long)divisor);
int digit = 0;
while ((newdivisor<<digit) <= newdividend) {
digit++;
}
long temp = newdividend;
for (int i = digit-1; i >= 0; i--) {
long t = newdivisor << i;
if (temp < t) {
continue;
}
temp -= t;
if (i == 0) {
res += 1;
} else {
res += 2<<(i-1);
if (res <= Integer.MIN_VALUE && sign==1) {
return Integer.MAX_VALUE;
}
}
}
if (sign == -1) {
return -res;
}
return res;
}
}
?
原文:http://hcx2013.iteye.com/blog/2217422