Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
边界条件需要仔细注意:
- 1<<32,如果没有指定是int,就会返回INT_MIN
- 对于equal情况,k也要++
以下代码不是最优最精简的
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend == 0)return 0;
long long lup = dividend;
long long ldown = divisor;
long long aup = abs(lup), adown = abs(ldown);
int sign = (((dividend>0) && (divisor>0)) || ((dividend<0) && (divisor<0))) ? 1 : -1;
if (adown>aup)return 0;
if (adown == aup)return sign;
int k = 1;
// this should be <= because you will minus one later
while ((adown << k) <= aup)
{
++k;
}
--k;
long long ret = 0;
while (aup >= adown && k >= 0)
{
if (adown << k <= aup)
{
ret += ((long long)1 << k);
aup -= (adown << k);
}
k--;
}
ret *= sign;
if (ret >= INT_MAX)return INT_MAX;
else if (ret <= INT_MIN)return INT_MIN;
return ret;
}
};