Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目大意:
两个数相除不用乘号,除号和求余运算符。
题目思路:
判断除数与被除数的正负,若为负转化为正数。
divideLong函数实现:商由1-2-4-8-16慢慢递增,直到2sum大于dividend被除数
最后得到的商为多个divideLong返回和。
如:10 /3
divideLong(10,3)
divisor 1 sum=3 3+3<=10
divisor 1+1=2 sum=6 6+6>10
divideLong(10-6,3)
divisor 1 sum=3 3+3>4
divideLong(1,3)
return 0
result=2+1=3
AC代码:
Java:
public int divide(int dividend, int divisor) {
long result = divideLong(dividend, divisor);
return result > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)result;
}
// It‘s easy to handle edge cases when
// operate with long numbers rather than int
public long divideLong(long dividend, long divisor) {
// Remember the sign
boolean negative = dividend < 0 != divisor < 0;
// Make dividend and divisor unsign
if (dividend < 0) dividend = -dividend;
if (divisor < 0) divisor = -divisor;
// Return if nothing to divide
if (dividend < divisor) return 0;
// Sum divisor 2, 4, 8, 16, 32 .... times
long sum = divisor;
long divide = 1;
while ((sum+sum) <= dividend) {
sum += sum;
divide += divide;
}
// Make a recursive call for (devided-sum) and add it to the result
return negative ? -(divide + divideLong((dividend-sum), divisor)) :
(divide + divideLong((dividend-sum), divisor));
}