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 ***** @冬雪雪冬 @jerryxjr1220 @lumber2388779
你们要的难题~ 我的程序。
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 冬雪雪冬 发表于 2017-5-8 21:43
我的程序。
要不要这么快呢。。。 其他数没有验算过,随便写写
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 jerryxjr1220 发表于 2017-5-8 22:03
其他数没有验算过,随便写写
我还在想,会不会有人用第2个函数来演算第一个函数的方法来求值呢。
结果大佬你还真来了一个这个。
方法确实可行的,唯独就是数字大了出来的就比较慢一些。 ooxx7788 发表于 2017-5-8 22:37
我还在想,会不会有人用第2个函数来演算第一个函数的方法来求值呢。
结果大佬你还真来了一个这个。
方 ...
我是偷懒了{:10_256:} 1 这题题目没理解,我理解的是二进制数是单数位的时候就是该多少多少,双数位就乘-1,可是看你test里面11010为什么是6而不是26。所以题目我理解可能存在问题 哦明白一点了,是要奇数位减偶数位 现在只有二转十的
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 终于看懂了,仍然是二进制不变,从右往左数,奇数位的数,前面加正号,偶数位前面加负号
如果只有奇数位有值(二进制肯定是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-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'))
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')) 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)) 只会简单的一半
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 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) 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')) 着急 2
页:
[1]
2