ooxx7788 发表于 2017-5-8 20:07:53

Python: 每日一题 41

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

计算机病毒爆发了,把我们的二进制世界给弄混乱了。
新的二进制规律是这样的,从右往左数的单位数仍然和过去一样,双数位均变成了负数。(看看你们幸福的,我把最难的理解题意这件事帮你们做了。)
为此,我给各位计算了5个字符的的新二进制表给大家参考。

好了,现在需要你做的事,给出两个函数分别为
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)


**** Hidden Message *****

新手·ing 发表于 2017-5-8 21:23:55

@冬雪雪冬 @jerryxjr1220 @lumber2388779
你们要的难题~

冬雪雪冬 发表于 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')

def negabinary_to_int(b):
    n = 0
    j = 1
    for i in b[::-1]:
      n += int(i) * j
      j *= -2
    return n

ooxx7788 发表于 2017-5-8 22:01:30

冬雪雪冬 发表于 2017-5-8 21:43
我的程序。

要不要这么快呢。。。

jerryxjr1220 发表于 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))
    while negabinary_to_int(t) != n:
      s += 1
      t = str(bin(s))
    return t
   
print(int_to_negabinary(6))

输出:
6
11010

ooxx7788 发表于 2017-5-8 22:37:28

jerryxjr1220 发表于 2017-5-8 22:03
其他数没有验算过,随便写写




我还在想,会不会有人用第2个函数来演算第一个函数的方法来求值呢。
结果大佬你还真来了一个这个。
方法确实可行的,唯独就是数字大了出来的就比较慢一些。

jerryxjr1220 发表于 2017-5-8 22:40:12

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

我是偷懒了{:10_256:}

whsb564308702 发表于 2017-5-10 11:39:53

1

余欲渔 发表于 2017-5-10 14:43:54

这题题目没理解,我理解的是二进制数是单数位的时候就是该多少多少,双数位就乘-1,可是看你test里面11010为什么是6而不是26。所以题目我理解可能存在问题

余欲渔 发表于 2017-5-10 14:47:00

哦明白一点了,是要奇数位减偶数位

余欲渔 发表于 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+=),0]
      ji+=)]
    fs=sum(*2**(l-i-1) for i in range(l)])
    zs=sum(*2**(l-i-1) for i in range(l)])
    return zs-fs

solomonxian 发表于 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 = +s[:-1] if n<0 else s# 负数符号弄掉,前面加一位
    lst = ]+*2# 加2位0,后面翻转也不影响结果
   
    for i in range(len(lst)):
      if lst == 1 and i%2 != 0: #符号相反项逢1进1
            lst+=1
      elif lst == 2: # 逢2进1清0,二进制加法
            lst += 1
            lst =0
            
    lst = lst if n<0 else lst #负数把之前加的一位去掉
    return "".join()

shigure_takimi 发表于 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)*(2**index) if index%2==0 else -int(s)*(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()[::-1]
    else:
      pass# 负数的不会做。



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

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


大头目 发表于 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 == 1 and j % 2 == 0:
                        sum1 += -2 ** (abs(j) - 1)
                elif i == 1 and j % 2 != 0:
                        sum1 += 2 ** (abs(j) - 1)
        dict1 = sum1
        dict2 = i
#print(dict2)

def int_to_negabinary(n):
        x = str(n)
        y = ''
        for each in dict2:
                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
       
print(int_to_negabinary(6))
print(negabinary_to_int('00011010'))

小庆子 发表于 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)
      if i%2 != 0:
            result -= (2**i)*int(strin)
    return result

print(negabinary_to_int(11010))

萧丹夜 发表于 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

算幽幽 发表于 2018-10-8 19:06:20

I Love FishC
def bit_trans(digit):
    digit=digit[::-1]
    result=0
    #0000110000 00010 01000
    for i in range(len(digit)):
      i=int(i)
      if digit=='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)

jrro452 发表于 2018-10-25 14:17:57

def int_to_negabinary(num):
    n = 0
    while True:
      bins=bin(n)
      binnum = bins.split("b")[::-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'))

holiday_python 发表于 2020-4-23 11:16:26

着急

19971023 发表于 2020-6-14 19:36:47

2
页: [1] 2
查看完整版本: Python: 每日一题 41