码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode-【中等题】Divide Two Integers

时间:2016-07-09 14:59:02      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

题目

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT

链接

https://leetcode.com/problems/divide-two-integers/

答案

1、int的最大值MAX_INT为power(2,31)-1 = 2147483647

2、int的最小值MIN_INT为-power(2,31) = -2147483648

3、当MIN_INT除以-1的时候,发生溢出,因为得到的值大于MAX_INT

4、有符号数的最高位为1时,表示负数,所以可以使用异或运算获得商的符号

5、abs的各种版本看这里,double abs(double),long abs(long)竟然在C++中有,其实我想自己写个求绝对值方法的,不过,手抖还是搜了一下abs的原型。

5、这才是重中之重,刚开始看到题目,我不知道怎么用位运算去实现除法,先搜到答案

然后思考其中的原理,为什么可以这么做,我的推理如下,如有问题,请指出,谢谢。下面我有^表示指数,不要跟C++中的^弄混了。

a = b * x (x为要求的商,等号应该为约等于)

任何一个整数是可以用二进制表示的,所以x=2^m + 2^n + ...... + 2^t,其中m > n > t,m,n,t为整数。

x还可以这么表示x = 1*2^m + 0 * 2^(m-1) + 1 * 2^(m-2) + ...... + (1或0)*2^0。

事实上x还可以这么表示:

x = (2^k + 2^(k-1) + ...... + 2^0) + (2^t + 2^(t-1) + ...... + 2^0) + ...... + (2^r + 2^(r-1) + ...... + 2^0),其中k > t > ...... > r。

所以 a = b * (2^k + 2^(k-1) + ...... + 2^0) +b *  (2^t + 2^(t-1) + ...... + 2^0) + ...... + b * (2^r + 2^(r-1) + ...... + 2^0).

第一次是 a - b * (2^k + 2^(k-1) + ...... + 2^0)  = b *  (2^t + 2^(t-1) + ...... + 2^0) + ...... + b * (2^r + 2^(r-1) + ...... + 2^0)

第二次是a - b * (2^k + 2^(k-1) + ...... + 2^0) - b *  (2^t + 2^(t-1) + ...... + 2^0) = ...... + b * (2^r + 2^(r-1) + ...... + 2^0)

推到这里,大家应该懂了

代码

技术分享
 1 class Solution {
 2 public:
 3     static const int MAX_INT = 2147483647;
 4     static const int MIN_INT = -2147483648;
 5     
 6     int divide(int dividend, int divisor) {
 7         if(dividend == MIN_INT && divisor == -1)
 8         {
 9             return MAX_INT;
10         }
11         
12         long pre = abs((long)dividend);
13         long post = abs((long)divisor);
14         int index;
15         int rem = 0;
16         
17         while(pre >= post)
18         {
19             long tmp = post;
20             for(index = 0; pre >= tmp; index ++, tmp <<= 1)
21             {
22                 pre -= tmp;
23                 rem += (1 << index);
24             }
25         }
26         
27         return (dividend >> 31) ^ (divisor >> 31) ? -rem:rem;
28     }
29 };
View Code

 

leetcode-【中等题】Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/Shirlies/p/5655777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!