还是二分法,整体并不困难,边界条件比较复杂,需要注意的比较多。贴原始代码

 1 class Solution {
 2 public:
 3     int divide(int dividend, int divisor) 
 4     {
 5         if(divisor == 1)
 6         return dividend;
 7         else if(divisor == -1 && dividend == INT_MIN)
 8         return INT_MAX;
 9         else if(divisor == -1 && dividend != INT_MIN)
10         return -1*dividend;
11         else if(divisor == 0)
12         return INT_MAX;
13         else if(dividend == 0)
14         return 0;
15         long long int flag = (dividend>0 && divisor>0) || (dividend<0 && divisor<0) ? 1:-1;
16         long long int dividend_1 = dividend>=0?dividend:-1*(long long int)dividend;
17         long long int divisor_1 = divisor>0?divisor:-1*(long long int)divisor;
18         if(dividend_1<divisor_1)
19         return 0;
20         long long int right = dividend_1;
21         long long int left = 1;
22         while(left<=right)
23         {
24             long long int mid = (left + right)/2;
25             if(mid*divisor_1 == dividend_1)
26             return flag*mid;
27             else if(mid*divisor_1 > dividend_1)
28             {
29                 right = mid - 1;
30             }
31             else
32             {
33                 if((mid+1)*divisor_1 >= dividend_1)
34                 return flag*mid;
35                 else
36                 {
37                     left = mid + 1;
38                 }
39             }
40         }
41         return flag*left;
42     }
43 };

再看了眼题解,发现不让用乘法,所以可以用最基本的二进制自加的方式来模拟乘法,,比如11/3,可以理解去判断2^0 *3,2^1 *3,2^2 *3这类结果,直到2^n * 3这个数大于被除数,则2^n-1就是结果中的一部分,对于剩下的部分则通过递归解决,很巧妙的解法,贴代码。

 1 class Solution {
 2 public:
 3     int divide(int dividend, int divisor) 
 4     {
 5         if(divisor == 1)
 6         return dividend;
 7         else if(divisor == -1 && dividend == INT_MIN)
 8         return INT_MAX;
 9         else if(divisor == -1 && dividend != INT_MIN)
10         return -1*dividend;
11         else if(divisor == 0)
12         return INT_MAX;
13         else if(dividend == 0)
14         return 0;
15         long flag = (dividend>0 && divisor>0) || (dividend<0 && divisor<0) ? 1:-1;
16         long dividend_1 = dividend>=0?dividend:-1*(long)dividend;
17         long divisor_1 = divisor>0?divisor:-1*(long)divisor;
18         return flag*div(dividend_1,divisor_1);
19     }
20     int div(long dividend,long divisor)
21     {
22         if(dividend<divisor)
23         return 0;
24         int count = 1;
25         long temp = divisor; 
26         while(temp + temp < dividend)
27         {
28             count = count + count;
29             temp = temp + temp;
30         }
31         return count+div(dividend-temp,divisor);
32     }
33 };