您的位置:首页 > 其它

[Leetcode]_29 Divide Two Integers

2017-05-25 23:15 417 查看
/**
*  Index: 29
*  Title: Divide Two Integers
*  Author: ltree98
**/


除法的模拟运算。

最简单的肯定是,除数一直减去被除数,直到除数小于被除数。

while(dividend >= divisor)  {
dividend -= divisor;
++ans;
}


这种方法肯定会超时(我不会说我试过。。。)

而且,显然题主不会是想让我们用这种方法来做,

题目中有明示了 division and mod operator(用位运算分解)

任何一个数都可以用以2的幂为底的数字序列之和。

比如:17 = 2^4*1 + 2^3*0 + 2^2*0 + 2^1*0 + 2^0*1

所以,就出现下面的这个解法,先找到最高可以减去的2的幂指数。

以17为例,找到4,

17 - 2^4*1 = 1

然后,再将1用3,用2,用1,用0,依次逐分。

最最后,注意一下数据处理。

首先,就是最小值,最大值部分。

然后,就是最后答案的正负值。

class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == INT_MIN)
if(divisor == 1)
return INT_MIN;
else if(divisor == -1)
return INT_MAX;
else if(abs(divisor) == 1)
return dividend*divisor;

long dividendTemp = dividend;
long divisorTemp = divisor;
int isNegative = 1;
if(dividendTemp < 0)    {
dividendTemp = abs(dividendTemp);
isNegative *= -1;
}
if(divisorTemp < 0) {
divisorTemp = abs(divisorTemp);
isNegative *= -1;
}

int maxFactor = 0;
while(divisorTemp <= (dividendTemp>>1)) {
divisorTemp <<= 1;
++maxFactor;
}

long ans = 0;
while(maxFactor >= 0)   {
if(dividendTemp >= divisorTemp) {
ans += 1<<maxFactor;
dividendTemp -= divisorTemp;
}
divisorTemp >>= 1;
--maxFactor;
}

if(ans >= INT_MAX)
return INT_MAX;
return ans*isNegative;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode