Given two integers dividend
and divisor
, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend
by divisor
.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3 Output: 3
Example 2:
Input: dividend = 7, divisor = -3 Output: -2
Note:
- Both dividend and divisor will be 32-bit signed integers.
- The divisor will never be 0.
- Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231− 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.
题目
不准乘除,不准膜。
思路
那剩下的还能用加减、位运算
代码
1 // Divide Two Integers 2 // 时间复杂度O(logn),空间复杂度O(1) 3 public class Solution { 4 public int divide(int dividend, int divisor) { 5 if(dividend == 0) return 0; 6 if (divisor == 0) return Integer.MAX_VALUE; 7 8 // 当 dividend = INT_MIN,divisor = -1时,结果会溢出 9 if (dividend == Integer.MIN_VALUE) { 10 if (divisor == -1) return Integer.MAX_VALUE; 11 else if (divisor < 0) 12 return 1 + divide(dividend - divisor, divisor); 13 else 14 return - 1 + divide((dividend + divisor), divisor); 15 } 16 if(divisor == Integer.MIN_VALUE){ 17 return dividend == divisor ? 1 : 0; 18 } 19 20 int a = dividend > 0 ? dividend : -dividend; 21 int b = divisor > 0 ? divisor : -divisor; 22 23 int result = 0; 24 while (a >= b) { 25 int c = b; 26 for (int i = 0; a >= c;) { 27 a -= c; 28 result += 1 << i; 29 if (c < Integer.MAX_VALUE / 2) { // prevent overflow 30 ++i; 31 c <<= 1; 32 } 33 } 34 } 35 36 return ((dividend^divisor) >> 31) != 0 ? (-result) : (result); 37 } 38 }