Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题解:
思路就是被除数减去除数,减尽为止。优化的方法是尽量少的做减法。由于不能用乘法,可以利用位操作,左移一位即为该数乘上2
Solution 1
1 class Solution { 2 public: 3 int divide(int dividend, int divisor) { 4 if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX; 5 long long m = abs((long long)dividend); 6 long long n = abs((long long)divisor); 7 8 int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1; 9 int res = 0; 10 while (m >= n) { 11 long long tmp = n, p = 1; 12 while (m >= (tmp << 1)) { 13 tmp <<= 1; 14 p <<= 1; 15 } 16 m -= tmp; 17 res += p; 18 } 19 return sign == 1 ? res : -res; 20 } 21 };
Solution 2
1 class Solution { 2 public: 3 int divide(int dividend, int divisor) { 4 if (!divisor || dividend == INT_MIN && divisor == -1) 5 return INT_MAX; 6 int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1; 7 unsigned dvd = abs(dividend); 8 unsigned dvs = abs(divisor); 9 int res = 0; 10 while (dvd >= dvs) { 11 unsigned temp = dvs, multiple = 1; 12 // 不可写作 dvd >= (tmp << 1),因为有可能溢出 13 while (dvd - temp >= temp) { 14 temp <<= 1; 15 multiple <<= 1; 16 } 17 dvd -= temp; 18 res += multiple; 19 } 20 return sign * res; 21 } 22 };