鱼C论坛

 找回密码
 立即注册
查看: 3980|回复: 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题中复制:

  1. test.assert_equals(int_to_negabinary(6), '11010')
  2. test.assert_equals(int_to_negabinary(-6), '1110')
  3. test.assert_equals(negabinary_to_int('11010'), 6)
  4. test.assert_equals(negabinary_to_int('1110'), -6)
复制代码



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

本帖被以下淘专辑推荐:

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

  3. print(negabinary_to_int('11010'))

  4. def int_to_negabinary(n):
  5.     s = 0
  6.     t = str(bin(s))[2:]
  7.     while negabinary_to_int(t) != n:
  8.         s += 1
  9.         t = str(bin(s))[2:]
  10.     return t
  11.    
  12. 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 | 显示全部楼层
现在只有二转十的
  1. def bit_to_int(s):
  2.     s=str(s)
  3.     if len(s)%2:s='0'+s
  4.     l=len(s)
  5.     ji=[]
  6.     ou=[]
  7.     for i in range(0,l,2):
  8.         ou+=[int(s[i]),0]
  9.         ji+=[0,int(s[i+1])]
  10.     fs=sum([ou[i]*2**(l-i-1) for i in range(l)])
  11.     zs=sum([ji[i]*2**(l-i-1) for i in range(l)])
  12.     return zs-fs
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 21:09:21 | 显示全部楼层
终于看懂了,仍然是二进制不变,从右往左数,奇数位的数,前面加正号,偶数位前面加负号
如果只有奇数位有值(二进制肯定是1),读出来就行;反之偶数位的读出来后取负数
如果奇偶都有值,就用把偶数位都变成0后的正数 与把奇数位都变成0后的数(负的)求和
  1. # 从右边向左,取奇数位数字中间插入'0',此正数;同样操作偶数位,末尾加'0',此负数
  2. # 两者取十进制数后求和
  3. def negabinary_to_int(s):
  4.     """二进制转十进制,字符串 -> 整型"""
  5.     p = int("0".join(reversed(s[::-2])),2)
  6.     n = - int("0".join(reversed(s[-2::-2]))+'0',2)
  7.     return p + n
复制代码

十进制转二进制要难一点,本来也考虑过用上一个函数从bin(n)开始暴力破解,不过还是试试另写
  1. # 首先,新码一定 >= 原码;其次,前n项中,偶数项的和s=2^1 + 2^3 +...+2^n一定小于2^n+1,
  2. # 即原二进制数位数往前加2位足够多(考虑到正负交替,1位是不现实的)
  3. # 对正数,偶数项前一项+1;对负数,奇数项往前一项+1;用于消除符号影响
  4. # 因为二进制刚好 2^(k+1) - 2^k == 2^k
  5. def int_to_negabinary(n):
  6.     """十进制转二进制,整型 -> 字符串"""
  7.    
  8.     s = list(reversed(bin(n)))
  9.     s = [0]+s[:-1] if n<0 else s  # 负数符号弄掉,前面加一位
  10.     lst = [int(j) for j in s[:-2]]+[0]*2  # 加2位0,后面翻转也不影响结果
  11.    
  12.     for i in range(len(lst)):
  13.         if lst[i] == 1 and i%2 != 0: #符号相反项逢1进1
  14.             lst[i+1]+=1
  15.         elif lst[i] == 2: # 逢2进1清0,二进制加法
  16.             lst[i+1] += 1
  17.             lst[i] =0
  18.             
  19.     lst = lst[1:] if n<0 else lst #负数把之前加的一位去掉
  20.     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 编辑
  1. def int_to_negabinary(i):
  2.     pass

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


  6. #二转十不难。十转二暂时想不出。
  7. #先下班吃饭去了。
复制代码

  1. def int_to_negabinary(n):
  2.     if n == 0:
  3.         return '0'
  4.     elif n > 0:
  5.         s = []
  6.         index = 1
  7.         while n!=1:
  8.             s.append(n%2)
  9.             index += 1
  10.             n = n//2
  11.             if n%2 == 0:
  12.                 s.append(n%2)
  13.                 n = n//2
  14.             else:
  15.                 s.append((n+2)%2)
  16.                 n = (n+2)//2
  17.         s.append(1)
  18.         return ''.join([str(i) for i in s])[::-1]
  19.     else:
  20.         pass  # 负数的不会做。



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

  24. for i in range(20):
  25.     print(i, '-->', int_to_negabinary(i))
  26. 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 | 显示全部楼层
  1. def int_to_negabinary(i):
  2.     string = ('')
  3.     while i != 0:
  4.         i,n = divmod(i,-2)
  5.         if n < 0:
  6.             i,n = i+1,n+2
  7.         string += '%s'%n
  8.         if i ==0 and n >=0:
  9.             break
  10.     return string[::-1]

  11. print(int_to_negabinary(6))

  12. def negabinary_to_int(s):
  13.     strin = str(s)[::-1]
  14.     result = 0
  15.     for i in range(0,len(strin)):
  16.         if i%2 == 0:
  17.             result += (2**i)*int(strin[i])
  18.         if i%2 != 0:
  19.             result -= (2**i)*int(strin[i])
  20.     return result

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

  12. def negabinary_to_int(num):
  13.     binnum = num[::-1]
  14.     ss = 0
  15.     for i,snum in enumerate(binnum):
  16.             ss+=int(snum)*(-2)**i
  17.     return ss

  18. print(int_to_negabinary(6))
  19. 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, 2024-4-18 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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