这道题是想用减法来实现除法,通常的做法是a不停的减b,看能减多少次,但是这样会有超时的情况,比如很大的数除以1,这个时候需要用到的技巧就是让b向左移位,相当于乘二,再跟a比较,如果a还是大,再把b移位,再比较,这样循环进行,直到a小,就减去最后一次移位之前b的值。简而言之,就是让a不停的减去最大可减的b的2的n次方倍,这样来更快的计算b的个数。这里用到了一些位运算,还有labs函数,返回的是long int 的结果(abs返回的是int)
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor == 0 || (dividend <= INT_MIN && divisor == -1))
return INT_MAX;
int sign = ((dividend < 0) ^ (divisor < 0))? -1: 1;
long long d1 = labs(dividend);
long long d2 = labs(divisor);
int count = 0;
while(d1 >= d2){
int left = 1;
while(d1 >= (d2 << left)) left++;
d1 -= d2 << (left - 1);
count += pow(2, (left - 1));
}
return sign == 1? count: -count;
}
};