/*
* 思路:用减法得出商,分别减去1倍的divisor,2倍的divisor,4倍的divisor...
* 1,2,4,8...
* */
public int divide1(int dividend, int divisor) {
int sign = 1;
if ((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0))
sign = -1;
//这里注意先转成long类型,在取绝对值
long ldividend=Math.abs((long)dividend);
long ldivisor=Math.abs((long)divisor);
if (ldivisor == 0) return Integer.MAX_VALUE;
if ((ldividend == 0) || (ldividend < ldivisor)) return 0;
long result=divideLong(ldividend,ldivisor);
if(result>= Integer.MAX_VALUE){
return (sign==1)?Integer.MAX_VALUE:Integer.MIN_VALUE;
}else{
return (int)result*sign;
}
}
//注意参数类型为long
private long divideLong(long ldividend, long ldivisor) {
if (ldividend < ldivisor)
return 0;
long sum=ldivisor;
long divide=1;
while ((sum+sum)<=ldividend){
sum+=sum;
divide+=divide;
}
return divide+divideLong((ldividend-sum),ldivisor);
}
做法2 思路同上,优化的地方是<<和>>的速度比加法的速度更快
public int divide(int dividend, int divisor) {
int sign=1;
if(dividend<0&&divisor>0||dividend>0&&divisor<0)
sign=-1;
long absDividend = Math.abs((long) dividend);
long absDivisor = Math.abs((long) divisor);
long result = 0;
while (absDividend>=absDivisor){
long tmp=absDivisor,count=1;
while ((tmp+tmp)<=absDividend){
tmp<<=1;
count<<=1;
}
result+=count;
absDividend-=tmp;
}
if(result>=Integer.MAX_VALUE)
return (sign==1)?Integer.MAX_VALUE:Integer.MIN_VALUE;
return sign*(int)result;
}