1.題目描述
給定兩個32位的除數和被除數,不使用除法求出商數
2.問題求解
除數設爲n,被除數設爲m,可以得到:m=n*(2^0+2^1+....2^t),由於被除數和除數都是32位,所以t<=32,時間複雜度爲O(32)=O(1)
注意數字越界
3.代碼實現
class Solution {
public int divide(int dividend, int divisor) {
boolean isNegative=((dividend<0&&divisor>0))||((dividend>0&&divisor<0));
long extractDividend=Math.abs(((long)dividend));
long extractDivisor=Math.abs(((long)divisor));
long result=divideRecur(extractDividend,extractDivisor);
result= isNegative?((0-result)):(result);
if(result>Integer.MAX_VALUE)
{
return Integer.MAX_VALUE;
}
if(result<Integer.MIN_VALUE)
{
return Integer.MAX_VALUE;
}
return (int)result;
}
private long divideRecur(long dividend,long divisor)
{
long tmpDivisor=divisor;
if(dividend<divisor)
{
return 0;
}
long result=1;
while(divisor<=dividend)
{
divisor<<=1;
result<<=1;
}
result>>=1;
divisor>>=1;
return result+divideRecur(dividend-divisor,tmpDivisor);
}
}