0%

LeetCode 29. Divide Two Integers

题目

原题在此

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, which means losing its fractional part. For example, truncate(8.345) = 8 and truncate(-2.7335) = -2.

Note:

  • Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [$−23^1$, $23^1$]. For this problem, assume that your function returns $23^1$ − 1 when the division result overflows.

Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Explanation: 10/3 = truncate(3.33333..) = 3.

Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Explanation: 7/-3 = truncate(-2.33333..) = -2.

Example 3:
Input: dividend = 0, divisor = 1
Output: 0

Example 4:
Input: dividend = 1, divisor = 1
Output: 1

Constraints:

  • $−23^1$ <= dividend, divisor <= $23^1$ - 1
  • divisor != 0

解析

题目假设机器只能存32位的整数, 所以不能用long, edge case只好用if处理掉.
直观思路就是在N(numerator, dividend)的绝对值大于0时, 减去尽可能多个的D(denominator, divisor)的绝对值. 并记录减了多少个. 此方法在N非常大或(且)D非常小时会很慢.
虽然不让用乘除操作但是可以用左右位移替代, 每次尝试减去尽可能多个的D.

代码

c++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
// f(N, D) -> (Q, R)
int divide(int N, int D) {
if(N == INT_MIN && D == -1) return INT_MAX;
if(N == INT_MIN && D == 1) return INT_MIN;
unsigned int n = abs(N), d = abs(D), q = 0;

for(int i = 31; i >= 0; i--) {
// subtract (d << i) from n if n still >= 0, add the quotient to q.
if((n >> i) >= d) {
n -= (d << i);
q += (1 << i);
}
}
return (N > 0) == (D > 0) ? q : -q;
}
};