您的位置:首页 > 编程语言 > Java开发

LeetCode29DivideTwoIntegers--In Java

2016-02-22 20:24 423 查看
主要采用的方法是:先不断通过移位操作找到divisor最接近dividend的倍数,如被除数是100,除数是3的话,这个倍数就是32。

然后用100减去3的32倍,这里的32倍是通过左移产生,并没有用到乘法。

这时,再用一个循环找到3的多少倍最接近于100和它32倍的差,即找到最接近于4的倍数,通过不断试探16倍,8倍,4倍。。。(通过右移),结果是1倍,为3。

再重复做差的动作,去找最接近1的3的倍数,当然是0倍。最后当做差的值小于3的一倍时,循环退出。

为了解决溢出的问题,参考了/article/5096783.html的方法,用long来进行运算,最后判定不溢出时再转换为int。

public int divide(int dividend, int divisor) {
long m = dividend;
long n = divisor;
long absn = Math.abs(n);
if(divisor==0){
return Integer.MAX_VALUE;
}
if(dividend==0){
return 0;
}

boolean flag1 = dividend<0?true:false;
boolean flag2 = divisor<0?true:false;
m = Math.abs(m);
n = Math.abs(n);
if(m<n)
return 0;
long ct = 1;//当前倍数
long tempresult = 0;
while((n<<1)<=m){
n = n<<1;
ct = ct<<1;
}

while(true){
tempresult = tempresult + ct;

m = m - n;
n = n>>1;
ct = ct>>1;

while(m<n){
n = n>>1;
ct = ct>>1;
}
if(n<absn)
break;
}

if((flag1==true&&flag2==false) || (flag1==false&&flag2==true))
return -(int)tempresult;
if(tempresult>Integer.MAX_VALUE)
return Integer.MAX_VALUE;
return (int)tempresult;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: