您的位置:首页 > 编程语言 > C语言/C++

Leetcode -- 29. Divide Two Integers

2017-04-21 09:46 453 查看

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

If it is overflow, return MAX_INT.

思路:不用乘法,除法和取模运算实现两个数的除法。

注意考虑边界,如果
divisor = -1, dividend = INT_MIN
这时候会产生溢出,直接返回
INT_MAX


如果每次用
dividend
减去
divisor
,会超时,因为如果
divisor = ±1
,时间复杂度为
O(dividend)


优化算法是每次把除数翻倍,这样可以大大减少时间复杂度。

C++代码如下:

int divide(int dividend, int divisor) {
if(divisor == -1) {
if(dividend == INT_MIN)
return INT_MAX;
else
return -dividend;
}
long long ret = 0;
int sign = 0;
if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))
sign = 1;
long long x = dividend >= 0 ? dividend : -(long long)dividend;
long long y = divisor >= 0 ? divisor : -(long long)divisor;

while(x>=y)
{
long long z = y;
for(int i = 0; x >= z; i++, z <<= 1)
{
x -= z;
ret += (1 << i);
}
}
if(sign)
return ret;
else
return -ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode c-c++