鱼C论坛

 找回密码
 立即注册
查看: 4628|回复: 22

[技术交流] Python: 每日一题 41

[复制链接]
发表于 2017-5-8 20:07:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ooxx7788 于 2017-5-9 12:44 编辑

计算机病毒爆发了,把我们的二进制世界给弄混乱了。
新的二进制规律是这样的,从右往左数的单位数仍然和过去一样,双数位均变成了负数。(看看你们幸福的,我把最难的理解题意这件事帮你们做了。)
为此,我给各位计算了5个字符的的新二进制表给大家参考。
QQ截图20170508200113.png
好了,现在需要你做的事,给出两个函数分别为
1、int_to_negabinary(i)  将10进制数转为新的二进制值。  例如: int_to_negabinary(6) --> '11010'
2、negabinary_to_int(s) 将新的二进制值转为10进制数。  例如: negabinary_to_int('11010')  --> 6
请注意返回值的类型。
并请注意,不要用单纯的建立一个字典的方式去解决问题,虽然我最后给出的测试代码中只要6。但是请你们考虑,如果是大数时应该怎样计算的问题。

测试代码如下,test.py请至33,34题中复制:
test.assert_equals(int_to_negabinary(6), '11010')
test.assert_equals(int_to_negabinary(-6), '1110')
test.assert_equals(negabinary_to_int('11010'), 6)
test.assert_equals(negabinary_to_int('1110'), -6)


游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-8 21:23:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-8 21:43:04 | 显示全部楼层
我的程序。
def int_to_negabinary(n):
    if n >= 0:
        i = 1
    else:
        n = -n
        i = 0
    while i < len(bin(n)) - 2:
        result = bin(n)
        if result[-1 - i] == '1':
            n += 2 ** (i + 1)
        i += 2
    return bin(n).split('b')[1]

def negabinary_to_int(b):
    n = 0
    j = 1
    for i in b[::-1]:
        n += int(i) * j
        j *= -2
    return n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-8 22:01:30 | 显示全部楼层

要不要这么快呢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-8 22:03:17 | 显示全部楼层
其他数没有验算过,随便写写
def negabinary_to_int(n):
    return int('0'.join(list(n[::-2]))[::-1], 2) - int('0'.join(list(n[-2::-2]))[::-1] + '0', 2)

print(negabinary_to_int('11010')) 

def int_to_negabinary(n):
    s = 0
    t = str(bin(s))[2:]
    while negabinary_to_int(t) != n:
        s += 1
        t = str(bin(s))[2:]
    return t
   
print(int_to_negabinary(6))

输出:
6
11010
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-5-8 22:37:28 | 显示全部楼层
jerryxjr1220 发表于 2017-5-8 22:03
其他数没有验算过,随便写写

我还在想,会不会有人用第2个函数来演算第一个函数的方法来求值呢。
结果大佬你还真来了一个这个。
方法确实可行的,唯独就是数字大了出来的就比较慢一些。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-8 22:40:12 | 显示全部楼层
ooxx7788 发表于 2017-5-8 22:37
我还在想,会不会有人用第2个函数来演算第一个函数的方法来求值呢。
结果大佬你还真来了一个这个。
方 ...

我是偷懒了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-10 11:39:53 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-10 14:43:54 | 显示全部楼层
这题  题目没理解,我理解的是二进制数是单数位的时候就是该多少多少,双数位就乘-1,可是看你test里面11010为什么是6而不是26。所以题目我理解可能存在问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-10 14:47:00 | 显示全部楼层
哦  明白一点了,是要奇数位减偶数位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-11 10:02:59 | 显示全部楼层
现在只有二转十的
def bit_to_int(s):
    s=str(s)
    if len(s)%2:s='0'+s
    l=len(s)
    ji=[]
    ou=[]
    for i in range(0,l,2):
        ou+=[int(s[i]),0]
        ji+=[0,int(s[i+1])]
    fs=sum([ou[i]*2**(l-i-1) for i in range(l)])
    zs=sum([ji[i]*2**(l-i-1) for i in range(l)])
    return zs-fs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 21:09:21 | 显示全部楼层
终于看懂了,仍然是二进制不变,从右往左数,奇数位的数,前面加正号,偶数位前面加负号
如果只有奇数位有值(二进制肯定是1),读出来就行;反之偶数位的读出来后取负数
如果奇偶都有值,就用把偶数位都变成0后的正数 与把奇数位都变成0后的数(负的)求和
# 从右边向左,取奇数位数字中间插入'0',此正数;同样操作偶数位,末尾加'0',此负数
# 两者取十进制数后求和
def negabinary_to_int(s):
    """二进制转十进制,字符串 -> 整型"""
    p = int("0".join(reversed(s[::-2])),2)
    n = - int("0".join(reversed(s[-2::-2]))+'0',2)
    return p + n
十进制转二进制要难一点,本来也考虑过用上一个函数从bin(n)开始暴力破解,不过还是试试另写
# 首先,新码一定 >= 原码;其次,前n项中,偶数项的和s=2^1 + 2^3 +...+2^n一定小于2^n+1,
# 即原二进制数位数往前加2位足够多(考虑到正负交替,1位是不现实的)
# 对正数,偶数项前一项+1;对负数,奇数项往前一项+1;用于消除符号影响
# 因为二进制刚好 2^(k+1) - 2^k == 2^k
def int_to_negabinary(n):
    """十进制转二进制,整型 -> 字符串"""
    
    s = list(reversed(bin(n)))
    s = [0]+s[:-1] if n<0 else s  # 负数符号弄掉,前面加一位
    lst = [int(j) for j in s[:-2]]+[0]*2  # 加2位0,后面翻转也不影响结果
    
    for i in range(len(lst)):
        if lst[i] == 1 and i%2 != 0: #符号相反项逢1进1
            lst[i+1]+=1
        elif lst[i] == 2: # 逢2进1清0,二进制加法
            lst[i+1] += 1
            lst[i] =0
            
    lst = lst[1:] if n<0 else lst #负数把之前加的一位去掉
    return "".join([str(i) for i in reversed(lst)])

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
ooxx7788 + 5 + 5 热爱鱼C^_^,每题都这么认真。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-5 17:36:13 | 显示全部楼层
本帖最后由 shigure_takimi 于 2017-12-6 09:02 编辑
def int_to_negabinary(i):
    pass

def negabinary_to_int(s): # Test OK
    s = s[::-1]
    return sum(int(s[index])*(2**index) if index%2==0 else -int(s[index])*(2**index) for index in range(len(s)))


#二转十不难。十转二暂时想不出。
#先下班吃饭去了。
def int_to_negabinary(n):
    if n == 0:
        return '0'
    elif n > 0:
        s = []
        index = 1
        while n!=1:
            s.append(n%2)
            index += 1
            n = n//2
            if n%2 == 0:
                s.append(n%2)
                n = n//2
            else:
                s.append((n+2)%2)
                n = (n+2)//2
        s.append(1)
        return ''.join([str(i) for i in s])[::-1]
    else:
        pass  # 负数的不会做。



def negabinary_to_int(s): # Test OK
    s = s[::-1]
    return sum(int(s[index])*(2**index) if index%2==0 else -int(s[index])*(2**index) for index in range(len(s)))

for i in range(20):
    print(i, '-->', int_to_negabinary(i))
print(negabinary_to_int('1110'))

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-18 15:57:01 | 显示全部楼层
import itertools

dict1 = dict()
dict2 = dict()
for i in itertools.product(range(2), repeat=8):
        sum1 = 0
        for j in range(-8,0):
                if i[j] == 1 and j % 2 == 0:
                        sum1 += -2 ** (abs(j) - 1)
                elif i[j] == 1 and j % 2 != 0:
                        sum1 += 2 ** (abs(j) - 1)
        dict1[i] = sum1
        dict2[str(sum1)] = i
#print(dict2)

def int_to_negabinary(n):
        x = str(n)
        y = ''
        for each in dict2[x]:
                y += str(each)
        return y

def negabinary_to_int(s):
        y = list()
        for each in s:
                #print(each)
                y.insert(88,int(each))
        y = tuple(y)
        #print(y)
        return dict1[y]
       
print(int_to_negabinary(6))
print(negabinary_to_int('00011010'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-21 09:38:12 | 显示全部楼层
def int_to_negabinary(i):
    string = ('')
    while i != 0:
        i,n = divmod(i,-2)
        if n < 0:
            i,n = i+1,n+2
        string += '%s'%n
        if i ==0 and n >=0:
            break
    return string[::-1]

print(int_to_negabinary(6))

def negabinary_to_int(s):
    strin = str(s)[::-1]
    result = 0
    for i in range(0,len(strin)):
        if i%2 == 0:
            result += (2**i)*int(strin[i])
        if i%2 != 0:
            result -= (2**i)*int(strin[i])
    return result

print(negabinary_to_int(11010))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-7 14:50:40 | 显示全部楼层
只会简单的一半
def negabinary_to_int(x):
    list_1 = []
    for each in x:
        list_1.append(int(each))
    list_1.reverse()
    k = y = 0
    for each in list_1:
        y += each * ((-2) ** k)
        k += 1
    return y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-8 19:06:20 | 显示全部楼层
I Love FishC
def bit_trans(digit):
    digit=digit[::-1]
    result=0
    #00001  10000 00010 01000
    for i in range(len(digit)):
        i=int(i)
        if digit[i]=='1':
            if i%2==0:
                result+=2**int(i)
            else:
                result-=2**int(i)
    return result

while True:
    a=bit_trans(input('5符进制:'))
    if a=='':
        break
    else:
        print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 14:17:57 | 显示全部楼层
def int_to_negabinary(num):
    n = 0
    while True:
        bins=bin(n)
        binnum = bins.split("b")[1][::-1]
        ss=0
        for i,snum in enumerate(binnum):
            ss+=int(snum)*(-2)**i
        if ss==num:
            return str(binnum[::-1])
        n+=1

def negabinary_to_int(num):
    binnum = num[::-1]
    ss = 0
    for i,snum in enumerate(binnum):
            ss+=int(snum)*(-2)**i
    return ss

print(int_to_negabinary(6))
print(negabinary_to_int('11101'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 11:16:26 | 显示全部楼层
着急
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-14 19:36:47 | 显示全部楼层
2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表