Divide Two Integers

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

需要注意的,int类型的数据,正数最大和负数最小可以表示到:

2147483647
-2147483648

正数最大的二进制码为:011111111......1111,负数最小的二进制码为:10000000000....00
均为32位的二进制表示。
并且正数+1后得到的数是负数最小的数,因为发生了溢出,这一定要注意。
同时负数最小数-2147483648取反,同样得到的二进制码相同,所以还是它本身。
这几个点一定注意。

同时还要注意,abs()取绝对值函数,为了防止发生溢出,一定要定义了新的long long之后再进行使用。
 1 class Solution {
 2 public:
 3     int getRes(long long div,long long sor)
 4     {
 5         if(div==0)
 6             return 0;
 7         if(div<sor)
 8             return 0;
 9         int res=0;
10         long long times=1;
11         long long remain=div;
12         long long var=sor;
13         while(remain-var>=0)
14         {
15             remain-=var;
16             res=res+times;
17             var*=2;
18             times*=2;
19         }
20         if(remain>0)
21             res+=getRes(remain,sor);
22         return res;
23     }
24     int divide(int dividend, int divisor) {
25         int MAX_INT=2147483647;
26         long long a=dividend;
27         long long b=divisor;
28         long long div=abs(a);  //先用两个long long类型的数据来存放dividend和divisor,否则会造成abs(-2147483648)溢出
29         long long sor=abs(b);
30         
31         int res=getRes(div,sor);
32 
33         
34         if((dividend>0&&divisor>0)||(dividend<0&&divisor<0))
35         {
36             if(res<0)
37                 return MAX_INT;
38             else
39                 return res;
40         }    
41         else
42         {
43             return 0-res;
44         }
45             
46     }
47 };

 

posted @ 2015-07-18 17:41  阿怪123  阅读(164)  评论(0编辑  收藏  举报