Divide two integers without using multiplication, division and mod operator.
思路:
直接的想法是用减法代替,但是减法在极端情况下肯定会超时,最多可能会有2^31。
然后考虑用移位,对除数左移位,直到将要大于被除数时为止,然后记录当前值,并更新被除数,如此循环。
需要注意的是,因为int的范围是-2^32到2^32,所以如果最小的负数取整数就会越界,所以使用unsigned int或者long long代替。
代码:
1 int divide(int dividend, int divisor) { 2 // IMPORTANT: Please reset any member data you declared, as 3 // the same Solution instance will be reused for each test case. 4 unsigned int big = abs(dividend), small = abs(divisor); 5 bool isNegative = (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0); 6 unsigned int result = 0; 7 while(big > small){ 8 unsigned int tmp = small; 9 unsigned int tresult = 1; 10 while(big > tmp){ 11 tmp = tmp<<1; 12 tresult = tresult<<1; 13 } 14 if(big == tmp){ 15 result += tresult; 16 break; 17 } 18 tmp = tmp>>1; 19 tresult = tresult>>1; 20 result += tresult; 21 big = big-tmp; 22 } 23 if(big == small) 24 result++; 25 if(isNegative) 26 return -result; 27 return result; 28 }
第二遍
1 long long divide2(long long dividend, long long divisor) { 2 if((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) 3 return -divide2(abs(dividend), abs(divisor)); 4 else if(dividend < 0 && divisor < 0) 5 return divide2(abs(dividend), abs(divisor)); 6 if(dividend == 0 || dividend < divisor) 7 return 0; 8 long long tmp = 1, num = divisor; 9 while(dividend >= (num<<1)){ 10 tmp = tmp<<1; 11 num = num<<1; 12 } 13 return tmp+divide2(dividend-num, divisor); 14 } 15 int divide(int dividend, int divisor) { 16 return divide2((long long)dividend, (long long)divisor); 17 }