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);
}
}