题目:
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.
代码:
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
sign = 1 #标记符号
if dividend > 0 and divisor < 0 or dividend < 0 and divisor > 0 :
sign = -1
dividend, divisor = abs(dividend), abs(divisor)
result = 0 #最终结果
#保留两个数,mi_div为实际除数,每除一次,mi_div翻一倍;add_time为商,跟mi_div保持同步
mi_div = divisor
add_time = 1
while dividend >= divisor :
if dividend >= mi_div : #如果被除数大于实际除数
dividend -= mi_div #减法代替除法
result += add_time #结果加上除数的倍数
mi_div = mi_div << 1 #除数继续翻倍
add_time = add_time << 1 #商翻倍
else :
mi_div = mi_div >> 1 #否则,当前被除数小于实际除数了,但仍大于原始除数,实际除数缩小
add_time = add_time >> 1
return max(-2**31, min(sign*result, 2**31-1))
#for example, if we want to calc (17/2)
# ret = 0;
# 17-2 ,ret+=1; left=15
# 15-4 ,ret+=2; left=11
# 11-8 ,ret+=4; left=3
# 3-2 ,ret+=1; left=1
# ret=8;