我正在尝试打印最大位数(n)以及这些位数能够表示的最大数量。我觉得问题出现在x = x%2
输入:
sortbit(3)
输出:
000
111
000
111
000
111
000
111
预期产出“
000
001
010
011
100
101
110
111
我的代码:
def sortbit(n):
max_num = 2**n
for x in range(0,max_num):
stringy = []
a = 0
while a < n:
a += 1
x = x % 2
if x == 0:
stringy.insert(a,'0')
else:
stringy.insert(a,'1')
t = ''.join(stringy)
print t
答案 0 :(得分:2)
您正在使用1
将任意号码转换为0
或x = x % 2
。您也可以打印str(x % 2) * n
。
您需要使用整数除法,并分别测试偶数或奇数。
更好的是,你可以将模数测试的输出作为字符串附加到stringy
:
stringy.insert(0, str(x % 2))
x = x // 2
使用简化的代码演示:
>>> def sortbit(n):
... max_num = 2**n
... for x in range(max_num):
... stringy = []
... for a in range(n):
... stringy.append(str(x % 2))
... x //= 2
... print ''.join(reversed(stringy))
...
>>> sortbit(3)
000
001
010
011
100
101
110
111
您也可以将值移位; >>
operator通过给定的步数将位移到右边; x >> 1
将x
中的位移一步,基本上除以2。
您还可以查看bin()
function(将值作为二进制字符串返回,以0b
开头)和format()
function以及str.format()
method,其中允许您使用b
输出格式将值格式化为二进制字符串。在循环中打印您的值可以很简单:
def sortbit(n):
for i in range(2**n):
print '{:0{}b}'.format(i, n)
最后但并非最不重要的是,您只是生成数字0和1,n
次的乘积。您也可以使用itertools.product()
来表达:
>>> from itertools import product
>>> for bits in product('01', repeat=3):
... print ''.join(bits)
...
000
001
010
011
100
101
110
111
但这可能被视为作弊。 : - )
答案 1 :(得分:2)
你已经得到了特定代码的答案,所以这里有一个解决方案,使用Python的format
来打印具有适当前导零数的二进制数字{/ 1}}:
n
答案 2 :(得分:1)
您应该在x % 2
中使用if
,而不是分配回x
if x % 2 == 0:
...
同样在每次迭代时你应该移到下一位,否则你会一遍又一遍地添加相同的位:
x = x >> 1