我必须实现这个伪代码(来自离散的数学书):
程序基础b扩展(n,b:正整数,b> 1
q :=n
k :=0
while q does not equal 0
a_k := q mod b
q = q div b
k = k + 1
返回(a_k-1, .... a_1, a_0)
{(a_k-1... a_1a_0)_b is the base expansion of n}
到目前为止,这是我的代码:
def expansion(n,b):
q = n
k = 0
a = []
i = len(str(n))
for x in range(0,1000):
a.append(0)
while q != 0:
a[k] = q % b
q = q / b
return a[k]
print expansion(444,2)
我只是无法弄清楚我做错了什么,通常说索引超出界限或打印的数字不够。
答案 0 :(得分:2)
在您的代码中,您没有更新k
,
while q != 0:
a[k] = q % b
q = q / b
# You need to update k
k += 1
此外,您只需要返回a
,不 a[k]
。
另外,要了解当前参数(444
,2
),在1085
变为零之前,您需要在数组中至少q
个位置。您不需要根据索引进行分配,而是在计算它们时将值附加到列表中。
所以,
def expansion(n,b):
q = n
k = 0
a = []
i = len(str(n))
while q != 0:
a.append(q % b)
q = q / b
k += 1
return a
这样您就可以避免必须事先分配地点。
答案 1 :(得分:0)
不是使用列表来累积数字,而是尝试使用字符串。当你得到一个数字时,将它连接到字符串的前面。像这样:
>>> def n_as_base_b(n, b):
... output = ""
... while n >0:
... output = str(n%b) + output
... n /= b
... return output
...
>>> n_as_base_b(15,2)
'1111'
>>> n_as_base_b(11,2)
'1011'