还是二分法,整体并不困难,边界条件比较复杂,需要注意的比较多。贴原始代码
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 };