-1
def is_hamming_numbers(x):
    if x == 1:
        return 1
    if x % 2 == 0:
        return is_hamming_numbers(x/2)
    if x % 3 == 0:
        return is_hamming_numbers(x/3)
    if x % 5 == 0:
        return is_hamming_numbers(x/5)
    return 0

    def hamming_numbers_sequence(x):
        if x == 1:
            return 1
        hamming_numbers_sequence(x-1)
        if is_hamming_numbers(x) == True:
            print("%s" % x, end=' ')


    print(is_hamming_numbers(7))
    print(is_hamming_numbers(1))
    
    hamming_numbers_sequence(24)
    print()

嗨,我需要打印汉明数,但我只能使用 if 循环来完成。如何使用 for 或 while 循环来做到这一点?

4

3 回答 3

1

此实现使用优先级队列,通过堆实现。

from heapq import heappush, heappop
from itertools import islice
 
def hamming_number_seq():
    heap = [1]
    while True:
        h = heappop(heap)
        while heap and h == heap[0]:
            heappop(heap)
        for m in [2,3,5]:
            heappush(heap, m*h)
        yield h
 
print(*(islice(hamming_number_seq(), 15))) # This prints the first 15 numbers of the sequence.

输出:

1 2 3 4 5 6 8 9 10 12 15 16 18 20 24
于 2020-11-30T10:25:55.843 回答
0

像这样的东西?

def is_hamming_numbers(x: int) -> bool:
    if x == 1:
        return True
    if x % 2 == 0:
        return is_hamming_numbers(x/2)
    if x % 3 == 0:
        return is_hamming_numbers(x/3)
    if x % 5 == 0:
        return is_hamming_numbers(x/5)
    return False


for n in range(1, 25):
    if is_hamming_numbers(n):
        print(n)
于 2020-11-30T10:12:29.487 回答
0

检查和打印汉明数的另一种方法,希望这会有所帮助。

蟒蛇代码:

# Hamming number has only prime factors as 2,3,5

def is_hamming_number(n):
    
    factors = [];
    
    hammingNumberCheck = {1,2,3,5,n}
    
    for i in range(1, n + 1):
        if n % i == 0:
            factors.append(i)
    
    factors_set = set(factors)
    
    if(factors_set.issubset(hammingNumberCheck)):
        return ":" + str(n) + ", is a hamming number"
    else:
        return ":" + str(n) + ", is not a hamming number"

print (is_hamming_number(10))

Ans - :10,是一个汉明数

于 2020-11-30T10:25:35.630 回答