您的位置:首页 > 其它

LeetCode (29)Divide Two Integers

2017-05-15 20:34 381 查看

(29)Divide Two Integers

题目:不用除法计算一个数与另一个数的商。

另外:当结果溢出int范围的时候,输出int范围最大的数字。

例如:

输入:dividend:-10;divisor:-1;
输出:10。

输入:dividend:-2147483648;divisor:1;
输出:-2147483648。


本来题目还是挺简单的,但是就这个int范围搞得有点烦。

除法就是减法的简单方法,然而如果直接使用减法做多次删减的工作,会导致TLE,所以使用位运算的方法,可以将除数每次做2的倍数的运算,每次减去这个数,就可以算出商是多少了。这样就从O(n)的算法变成O(logn)的算法,减少不少时间。

下面是代码:

class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == 0 || divisor == 0){
return 0;
}
unsigned int dividend_abs = abs(dividend),
divisor_abs = abs(divisor);
int flag = (dividend < 0) ^ (divisor < 0);
int len = 0;
while(divisor_abs < dividend_abs){
divisor_abs = divisor_abs << 1;
len ++;
}
unsigned int temp = divisor_abs;
temp = temp >> 1;
divisor_abs = divisor_abs >> len;
len --;
if(len == -1){
return (divisor_abs > dividend_abs)?(0):(flag==0?1:(0-1));
}
dividend_abs -= temp;
int result = 1 << len;
while(len >= 0){
if(temp <= dividend_abs){
dividend_abs -= temp;
result += 1 << len;
}
else{
len --;
temp = temp >> 1;
}
}
if(result < -2147483647 || result > 2147483647){
return flag==0?2147483647:-2147483648;
}
return flag==0?(result):(0-result);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: