这道题是想用减法来实现除法,通常的做法是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; } };
转载请注明原文地址: https://ju.6miu.com/read-38172.html