您的位置:首页 > 其它

leetCode:Divide Two Integers

2017-06-10 13:55 239 查看

Divide Two Integers

题目

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

求两个数相除,但不允许使用乘法,除法和余数操作符

思路

最直观的方法是,用被除数逐个的减去除数,直到被除数小于0。这样做会超时。

那么如果每次不仅仅减去1个除数,计算速度就会增加,但是题目不能使用乘法,因此不能减去k*除数,我们可以对除数进行左移位操作,这样每次相当于减去2^k个除数,如何确定k呢,只要使 (2^k)除数 <= 当前被除数 <(2^(k+1))除数.

这道题还要考虑溢出问题

AC代码

public class Solution {
public int divide(int dividend, int divisor){
//定义为long防止负数转换为正数时溢出
long divd = dividend,divs = divisor;
if(divs < 0)
divs = -divs;
if(divd < 0)
divd = -divd;
long res = 0;
while(divd >= divs){
long a = divs;
int count = 0;
//找到(2^k)*除数 <=  当前被除数 <(2^(k+1))*除数.

for(int i = 1; a <=divd; i++){
a<<=1;
count++;
}
//得到2^k
res += (1 << (count - 1));
//被除数减去(2^k)*除数,进入下一次循环判断条件
divd -= (divs << (count - 1));

}
//当答案为正 且 强制转换为负数时 说明溢出了
返回MAX_INT
if(!(dividend>0 ^ divisor>0) && (int)res==-2147483648){
return 2147483647;
}
//判断答案是正是负
return (dividend>0 ^ divisor>0) ? (int)-res : (int)res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode it