29两数相除,递归求解

在这里插入图片描述
溢出是啥意思,我们都知道在计算机中,数使用二进制保存的,如
在这里插入图片描述
这个第一位就是符号位。计算机用补码保存数据,
在这里插入图片描述
所以会溢出。
用自己想出来的办法求解实在是太舒服了 虽然性能很差!
首先它有个32位有符号整数环境的前提,所以得把边角处理一下,
如果除数为-2^32:
被除数为1,结果就是它本身。
被除数为-1,结果为2^32-1
如果被除数为-2^32:
除数为-2^32,结果就是1。
除数为其他,结果为0
因为不能使用乘法除法以及mod运算,所以我用加减法,然后用除数dividend以次跟被除数的倍数d比较,但是不是一倍一倍往上增,而是1,2,4,8这种方式往上增(我们需要记录这个数count),就是前一个数是后一个数的2倍,(这里只需要用加法就可以)。
然后等到dividend<d的时候,我们用dividend-pred,这个pred就是前一个d在进行一次,直到这次count做出来是1.
要实现这一个算法,我们需要记录前一个和现在的d,count,我们分别用pred,d以及prec和c来记录。
步骤:
首先考虑溢出情况,
在考虑正负号,异号结果为负,同号为正
然后迭代:prec =0,count = 1,pred = 0,d = divisor
比较devident和d的大小如果dividend大,pred = d,d =d+d,prec = count,count=count+count
如果d大,迭代,但是要先保存prec,prec是此次的结果
最后把所有的prec相加。
用88和3举个例子:
第一次迭代,结果为16因为下一个d为96,大于88了
第二次迭代,结果为8
第三次迭代,结果为4
第四次迭代,结果为1(条件)
结束、

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        if dividend == -2**32:
            if divisor==1:
                return -2**32
            if divisor == -1:
                return -2**32+1
        elif divisor == -2**32:
            if dividend == -2**32:
                return 1
            else:
                return 0
        if (divisor<0 and dividend<0) or (divisor>0 and dividend>0):
            flag =1
            dividend = abs(dividend)
            divisor = abs(divisor)
        else:
            dividend = abs(dividend)
            divisor = abs(divisor)
            flag = 0
        def recursion(dividend,divisor):
            if dividend<divisor:
                return [0]
            re = []
            prec =0
            count = 1
            pred = 0
            d = divisor
            while(dividend>=d):
                pred = d
                d = d+d
                prec = count
                count = count+count
            re.append(prec)
            re = re+recursion(dividend-pred,divisor)
            return re
        a = recursion(dividend,divisor)
        result = sum(a)
        if flag == 1:
            return result
        else:
            return -result




d = -21
ds = 1
a=Solution().divide(d,ds)
print(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值