思路:网上借鉴的方法,二分法。就是将除数每次扩大2倍,直到大于被除数,此时是一部分倍数,将被除数减去最近一次的新除数(<被除数),累积所有的倍数,得到结果。注意,int边界问题,中间过程最好用long long保存结果,注意abs(INT_MIN) = INT_MIN < 0,在这个小bug上弄了很久,T_T!
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend==0) return 0;
int isNegative = 1;
if((dividend < 0 && divisor>0) || (dividend > 0 && divisor<0)) isNegative = -1;
long long dividend_2 = dividend, divisor_2 = divisor, mulriple;
dividend_2 = abs(dividend_2);
divisor_2 = abs(divisor_2);
int ret = 0;
while(dividend_2 > 0){
mulriple = 1;
long long tempDivisor = abs(divisor_2);
while(dividend_2 >= tempDivisor){
mulriple <<= 1;
tempDivisor <<= 1;
}
tempDivisor >>= 1;
mulriple >>= 1;
dividend_2 -= tempDivisor;
ret += mulriple;
}
return ret * isNegative;
}
};