Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
法一:可以直观的利用除数的倍数,但如果这个倍数很大(题目中要求不能用乘法)则会造成LTE, 此法不可行!!!
class Solution {
public:
int divide(int dividend, int divisor) {
int times = 0;
bool isNeg = false;
if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) isNeg = true;
if(divisor == 0) return INT_MAX;
if(divisor == -1 && dividend == INT_MIN) return INT_MAX;
dividend = abs(dividend);
divisor = abs(divisor);
int ndivisors = divisor;
while(dividend - ndivisors >= 0){
ndivisors += divisor;
times++;
}
return isNeg? -times : times;
}
};
法二:二分法和位操作
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;
bool isNeg = (dividend < 0) ^ (divisor < 0);
long dvd = labs(dividend);
long dvs = labs(divisor);
int res = 0;
while(dvd >= dvs){
long tmpdvs = dvs, tmprs= 1;
while(dvd >= (tmpdvs << 1)){
tmpdvs <<= 1;
tmprs <<= 1;
}
dvd = dvd - tmpdvs;
res += tmprs;
}
return isNeg? -res: res;
}
};