一、题目分析
给两个整数,要求不用乘除模号,实现除法。注意这里假设数据用32位存储,最小负数为-231 ,最大整数为231 -1,被除数若为最小负数并且除号为-1结果为231 越界,只针对此特殊情况返回最大整数即可
二、方法与代码实现
(1)大神的方法
总结:
- 同号异号处理可以放在结尾,中间过程使用绝对值计算
return (A > 0) == (B > 0) ? res : -res;
positive = (dividend < 0) is (divisor < 0)
if not positive:
res = -res
return min(max(-2**31, res), 2**31-1)
- 减去除数的倍数加快减法计算,记录此倍数
for (x = 0; a - (b << x << 1) >= 0; x++);
res += 1 << x;
- 最小负数向最大正数转换的越界处理
全部代码:
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend == -2147483648 and divisor==-1:
return 2147483647
a, b, res, x=abs(dividend), abs(divisor), 0, 0
while a-b >= 0:
x =0
while a-(b<<x<<1)>=0:
x+=1
res += 1<<x
a -= b<<x
return res if (dividend>0) == (divisor>0) else res*-1
(2)我的方法
超时:符号判断不够优化,减法没有加速
扩展:了解了异或运算是不带进位的位加法,要实现带进位的位加法,可以相与两个加数结果左移一位即得到进位,将此进位同异或结果分别作为新的加数,重复循环直到代表进位的加数为0:
参考:https://blog.csdn.net/snail_coder/article/details/9227757