Divide Two Integers

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     }

 

posted on 2013-11-26 23:18  waruzhi  阅读(165)  评论(0编辑  收藏  举报

导航