您的位置:首页 > 其它

【Leetcode】29. Divide Two Integers

2018-03-07 12:23 288 查看
Question:

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

If it is overflow, return MAX_INT.

Tips:

不使用乘除以及取余,来求两个整数的除法。如果溢出,返回Integer.MAX_VALUE;

思路:

首先涉及到除法,一定要保证除数不能为0.

可以使用加法,用一个sum变量,加上divisor。这里可以采用二分查找的思想,令sum的初值为divisor,之后 sum+=sum。这样可以指数级速度找到最接近dividend,并且小于它的整数。剩下的继续这样的操作。

代码:

public int divide(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);
//分子不可等于0
if (ldivisor == 0)
return Integer.MAX_VALUE;
if ((ldividend == 0) || ldividend < ldivisor)
return 0;
long lans = ldivid(ldividend, ldivisor);
int ans;
if (lans > Integer.MAX_VALUE) {
ans = (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
} else {
ans = (int) lans * sign;
}
return ans;
}

private long ldivid(long ldividend, long ldivisor) {
if(ldividend<ldivisor)return 0;
long sum=ldivisor;
long ans=1;
//二分的方式找到最接近切小于dividend的数
while((sum+sum)<=ldividend){
sum+=sum;
ans+=ans;
}
return ans+ldivid(ldividend-sum,ldivisor);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: