我正在编写一个编程问题,我需要编写一个需要第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是汉明数。
很抱歉,如果问题令人困惑,如果您需要我澄清一些问题,我会尝试更好地解释。
答案 0 :(得分:3)
汉明数是一个只有素数因子2,3和5的数字。
在数论中,这些数字被称为5平滑,因为它们可以 被定性为仅有2,3或5作为主要因素。
您可能希望了解prime factors are及其工作原理。但基本上它意味着如果你采用素因子并将它乘以足够的次数,你就可以得到原始数字。一个主要因素是可能的最低乘数(因为你不能小于素数)。
例如,如果您的数字为12,12则可以被6,4,3和2整除。在这四个因子中,2是非素数,因此可以进一步推导出来。 6可以除以2和3.而4乘2.因此我们的素因子是2和3。
你的代码将汉明数的素数因子加到i,j和k幂。只要素因子是正确的,那么权力是什么并不重要。所以,你可以得到一个汉明(128)与2 ^ 7,即使7不是汉明因为2是重要的。例如,2 ^ 7实际上只是2 x 2 x 2 x 2 x 2 x 2.所以7真的没有参与。你的初始列表只是一个随机整数列表,它与汉明没有任何关系。 2,3和5是键。