如何在Python中实现base b扩展?

时间:2014-01-29 02:42:51

标签: python base expansion

我必须实现这个伪代码(来自离散的数学书):

程序基础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)

我只是无法弄清楚我做错了什么,通常说索引超出界限或打印的数字不够。

2 个答案:

答案 0 :(得分:2)

在您的代码中,您没有更新k

while q != 0:
    a[k] = q % b
    q = q / b

    # You need to update k
    k += 1

此外,您只需要返回a a[k]

另外,要了解当前参数(4442),在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'