1.题目
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
在不用乘号,除号,以及取余的情况下,计算两个数相除的结果。
2.思路
这么多符号不给用,那么我们很自然的想到位移符号<< 和 >> 。 那么怎么用呢?其实一开始也就有个模糊的想法,可不可以用2的多少次方表示这两个数呢,再联想一下整理下思路如下:
小学的时候学过: 被除数(dividend) / 除数(divisor) = 商 (quotient )。。。。余数( remainder)
那么商其实可以表示成 2^k1 + 2^k2 + 2^k3 + .....
例如: 92 / 3 = (2^4 + 2^3 + 2^2 + 2^1) ...2 (整数除法中余数可以不要)
所以,代码如下:
class Solution {
public:
int divide(int dividend, int divisor) {
if((dividend==INT32_MIN && divisor==-1) || !divisor)
return INT32_MAX;
int sign=(dividend<0)^(divisor<0)?-1:1;
long long dvd=labs(dividend);
long long dvs=labs(divisor);
int res=0;
while(dvd >= dvs)
{
long long tmp=dvs<<1,k=1;
while(dvd >= tmp)
{
tmp<<=1;
k<<=1;
}
dvd-=tmp>>1;
res+=k;
}
return sign==1?res:-res;
}
};