负二进制转换

负二进制转换实例解析

这个是leetcode上的一道编程题,题目如下:

  这道题有一定难度,不但需要知道怎么转换负二进制,还要清楚什么时候停止转换二进制。
  我一开始的思路是找110这个负二进制和10这个原本的二进制之间的关系,但是方向错了。后来又在网上搜了下,知道了怎么操作,但是网上的资料说的不清不楚,没有明确说我们整除到什么条件停止,因此在研究这上面浪费了时间。具体的解析如下:

例:N=3
  我们求其负二进制的过程和求正二进制的过程差不多,但是中间细节需要更改下,另外整除停止的条件是N=1。我们用res=’'保存余数

3//(-2)=-2…-1 注意此处余数为负,我们需要将其转为正数,即余数为1;同时,我们的N也不是简单的等于-2,我们的N要更新为-2+(1)=-1,即N要更新为商减去上次负余数的绝对值,res将余数1保存进去,更新为res=‘1’

-1//(-2)=0…-1 此时余数为-1,我们应该做的处理和上一步一样,即将余数转为正数,同时将N更新,即N=0+1=1,res将余数1保存进去,res=‘11’

注意,这就到了停止整除的条件:N=1,至于为什么到N=1停止,我没有深入去验证。N=1,停止,同时我们还要往res内再保存入一个1,即res=‘111’。返回res的反序。(因为我们是倒着将余数保存进去的,所以我们返回的时候要逆序输出)

举例熟悉:
N=4
4//(-2)=-2…0   余数0,不用转整数,N也不用变,N=-2,res=‘0’
-2//(-2)=1…0   余数0,N=1,res=‘00’
N=1,停止整除,res=‘001’,逆序返回’100’

N=6
6//(-2)=-3…0   余数0,N=-3,res=‘0’
-3//(-2)=1…-1   余数-1,需要转为正数1,N=1+1=2,res=‘01’
2//(-2)=-1…0   余数0,N=-1,res=‘010’
-1//(-2)=0…-1   余数-1,转为正数1,N=0+1=1,res=‘0101’
N=1,停止,res=‘01011’,逆序返回’11010’

代码如下:

class Solution:
    def baseNeg2(self, N: int) -> str:
        if N==0:return '0'
        res=''
        while 1:
            b=N%(-2)
            if N==1:#停止条件
                res+='1'
                return res[::-1]
           
            #余数判断,N的更新
            if b==0:
                res+=('0')
                N=N//(-2)
            else:
                res+=('1')
                N=N//(-2)+1 

至此,负二进制转换解析完了,但是至于为什么要这么做、这么转换,我就不知道了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值