您的位置:首页 > 其它

29. Divide Two Integers

2016-01-10 19:47 344 查看
Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

不用乘、除、取模做除法。

假设y/x,结果可以表示为(2^i+2^j+…..)*x = y的组合,先找到最大的(2^j)*x <= y,然后更新y = y - (2^j)*x,继续寻找2^i直至y < x.

有可能溢出,所以把所有int都转换成long

public class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 0) return Integer.MAX_VALUE;
if(dividend == 0) return 0;
int flag = 1;
if(dividend > 0 && divisor < 0 || dividend < 0 && divisor > 0 ) flag = -1;  //负数
//防止溢出,所有int都转换成long
long dy = Math.abs((long)dividend);
long dx = Math.abs((long)divisor);
if(dx > dy) return 0;
long result = 0;
//(1+2+4+....+2^n) * dx = dy
//这个过程相当于二分查找
while(dx <= dy){
long k = 1;
long tmp = dx;
while((dx << 1) <= dy){
dx = dx << 1;   //相当于dx*2
k = k << 1;
}
result += k;
dy -= dx;
dx = tmp;
}
result = result*flag;
if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) return Integer.MAX_VALUE; //溢出
return (int)result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: