【LeetCode】29. 两数相除

 

 1 class Solution {
 2 public:
 3     int divide(int a,int b) {
 4     if (b == -1)
 5     {
 6         if(a == INT_MIN)
 7             return INT_MAX;
 8         return -a;
 9     }
10     if (a!=INT_MIN && b== INT_MIN)
11         return 0;
12     if (a==b)
13         return 1;
14     if (b == 1)
15         return a;
16     if (a==-b)
17         return -1;
18 
19     int sign = 0;
20     if ((a > 0 && b < 0) || (a < 0 && b > 0))
21         sign = 1;
22 
23     if (a > 0)
24         a = -a;
25     if (b > 0)
26         b = -b;
27 
28     int base = 1, cp = b,ans=0;
29 
30     while (a <= b)
31     {
32         cp=b; //存一下当前循环的除数
33         base = 1;
34         while(cp>=0xc0000000&&a<=cp+cp)   //0xc0000000表示INT_MIN的一半
35         {
36             base+=base;
37             cp+=cp;
38         }
39         ans+=base;
40         a-=cp;
41     }
42 
43     if(sign)
44         return -ans;
45     return ans;
46     }
47 };

 

主要思想首先对可能超时或者溢出的结果进行特殊判定。

对需要进行计算的值,找到最接近被除数a的2^k值,a>cp+cp时则找到了这个值,否则cp和商扩倍;

当找到了这个商后,则加到结果中,被除数减去这个商,继续重复这个循环,直到被除数大于除数,返回结果。

 

这是一种优化算法,效率接近logn,前面带一常数但不是n

posted @ 2022-01-20 08:45  Jerry2km1  阅读(61)  评论(0)    收藏  举报