给定两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend
除以除数 divisor
得到的商。
示例 1:
输入: dividend = 10, divisor = 3 输出: 3
示例 2:
输入: dividend = 7, divisor = -3 输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
第一种思路:
除法的本质就是被除数不断减去除数 ,当被除数比除数小的时候,被除数就是余数,减法的次数就是商。
所以简单的可以得到下面的代码。
但由于CASE 太大了,逐个减除数比较慢,容易超时,所以需要优化减法的过程。
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
# 计算被除数可以减去多少个除数:
op = 1
if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0):
op = -1
dividend, divisor = abs(dividend), abs(divisor)
res = 0
while(dividend >= divisor):
dividend -= divisor
res += 1
INT_MIN = -(2 **31)
INT_MAX = 2 **31 - 1
res *= op
return res if INT_MIN <= res <= INT_MAX else INT_MAX
第二种思路:
在减法的过程优化一下:
如果是要计算2000 / 2, 那么根据第一种思路,2000要减去1000次2,这显然比较慢,
可以这么计算
2000 - 2 = 1998
1998 - 2 ** 2 = 1994
1994 - 2 ** 3 = 1986
1986 - 2 **4 = 1970
1970 - 2 **5 = 1938
1938 - 2 ** 6 = 1874
1874 - 2 ** 7 = 1746
1746 - 2 **8 = 1490
1490 - 2 **9 = 978
........
可以看到,在这样的计算方法下,被减数减小的速度会大幅加快。
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
# 计算被除数可以减去多少个除数:
op = 1
if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0):
op = -1
dividend, divisor = abs(dividend), abs(divisor)
res = 0
while(dividend >= divisor):
multidivisor, multi = divisor, 1
while(dividend >= multidivisor):
res += multi
dividend -= multidivisor
multi = multi << 1
multidivisor = multidivisor <<1
INT_MIN = -(2 **31)
INT_MAX = 2 **31 - 1
res *= op
return res if INT_MIN <= res <= INT_MAX else INT_MAX