您的位置:首页 > 其它

29. Divide Two Integers

2016-03-22 00:11 435 查看
Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Subscribe to see which companies asked this questionc

思路:

首先,最基本的方法是将被除数减去除数,直至被除数小于除数,相减的次数就是商的大小。但是这种方法超时。

在上述方案的基础上,做出适当改进。将除数不断进行左移操作,即乘以2,直至除数大于或者等于被除数。记录左移的次数,即除数放大的倍数,记为temp。然后将被除数与放大之后的除数做减法运算,其效果相当于减去了temp个原来的除数。将temp累加到计数器上。重复这个循环,直至被除数小于除数。最终计数器的值就是商。

注意一点,对于溢出题目给出了超出上限,直接返回上限值。这里需要注意abs(INT_MIN)=INT_MAX+1 .

class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend==0)
return 0;
long long m= abs((long long) dividend);
long long n =abs((long long) divisor);
long long ret=0;
//是否商是负数
bool flag =(dividend >0) ^(divisor>0);
while (m>=n){
long long temp=1;
long long a= n;
while ((a<<1)<m){
a=a<<1;
temp=temp<<1;
}
ret+=temp;
m-=a;
}
if(!flag){
if(ret>=INT_MAX)
return INT_MAX;
return ret;
}
if(ret >INT_MAX)
return INT_MIN;
return -ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: