diff --git a/main.py b/main.py index 8d66d7cefefddc309572181729b3683e2775cfbe..870b53c1b8fe54cd49f93492c3dbd0e7b7b3989a 100644 --- a/main.py +++ b/main.py @@ -1,28 +1,41 @@ """Hamming Number Challenge.""" -def ham(): - """Calculate First 8000 Hamming numbers.""" - ham_list = set() - for i in range(20): - for j in range(20): - for k in range(20): - ham_list.add(2**i * 3**j * 5**k) - return sorted(ham_list, key=int) +def hamming(n): + """Returns the nth hamming number.""" + + ham_list = [1] * n + + x2, x3, x5 = 2, 3, 5 + i, j, k = 0, 0, 0 + for num in range(1, n): + ham_list[num] = min(x2, x3, x5) + if ham_list[num] == x2: + i += 1 + x2 = 2 * ham_list[i] + if ham_list[num] == x3: + j += 1 + x3 = 3 * ham_list[j] + if ham_list[num] == x5: + k += 1 + x5 = 5 * ham_list[k] + return ham_list[-1] def main(): """Drive the example.""" - ham_list = ham() - def is_ham(x): - return x in ham_list + print("First 25 hamming numbers :") + for i in range(1, 25+1): + print(hamming(i), end=', ') + print() - print("First 25 hamming numbers\n", ham_list[:25]) - print("The 137th hamming number\n", ham_list[136]) + print("The 137th hamming number\n", hamming(137)) - print("%d is ham? %s" % (1700, is_ham(1700))) - print("%d is ham? %s" % (1215, is_ham(1215))) + lst = [hamming(h) for h in range(1, 1001)] + + print("%d is ham? %s" % (1700, 1700 in lst)) + print("%d is ham? %s" % (1215, 1215 in lst)) if __name__ == "__main__":