(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);
}
};