【发布时间】:2014-09-23 17:53:11
【问题描述】:
我正在做一个编程问题,要求我编写一个需要第 n 个汉明数的函数。
我有一些代码可以创建一个大小为 n 的列表,列表中的每个值都是“1”,然后使用列表进行一些操作以更改列表的值,以便列表中的每个值都是汉明数。
代码在这里:
def hamming(num):
#Make a list of size n, n-1 is the value we want to return.
h = [1] * num
#Make 3 variables representing the 2^i, 3^j, 5^k of our hamming number.
x2, x3, x5 = 2,3,5
#Counter variables that we will raise 2, 3, and 5, to.
i = j = k = 0
#Our initial list is filled with n values of the integer 1.
for n in xrange(1, num):
#Get the smallest number, then we will multiply it by 2, 3, or 5.
h[n] = min(x2, x3, x5)
if x2 == h[n]:
i += 1
x2 = 2 * h[i]
if x3 == h[n]:
j += 1
x3 = 3 * h[j]
if x5 == h[n]:
k += 1
x5 = 5 * h[k]
return h[-1]
本质上,我的问题不是这种生成汉明数的方法如何工作,而是为什么。例如,128 是一个汉明数,2^7 * 3^0 * 5^0 也是 128。但是,因为 7 不是汉明数,而这会使用列表中先前计算的值生成汉明数,我猜我在问为什么对于以 2^i * 3^j * 5^k 表示的任何汉明数,您可以生成汉明数而 i、j 或 k 不是汉明数。
对不起,如果问题令人困惑,如果您需要我澄清一些问题,请尽管问,我会尽力解释得更好。
【问题讨论】:
-
“看来,对于以
2^i * 3^j * 5^k表示的任何汉明数,您都可以生成没有i、j或k是汉明数的汉明数” i> - 是的,这是正确的。