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 };