一、题设
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
二、基本思路
左移运算,指数倍地尝试减去一个、两个、四个、八个……除数。
三、代码实现
def divide(self, dividend, divisor):
# 数值结果
result = 0
# 标志位
sign = 1
if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0):
sign = -1
# 转成正数运算
dividend = abs(dividend)
divisor = abs(divisor)
# 开始减
while dividend >= divisor:
weight = 1
tmp = divisor
while dividend >= tmp:
dividend -= tmp
result += weight
weight = weight << 1
tmp = tmp << 1
# 判断越界情况
if (result * sign < - pow(2,31)) or (result * sign > pow(2,31)- 1):
return pow(2,31) - 1
return result * sign