メインコンテンツへスキップ
  1. ノート/
  2. 数学/

hamming_number_solutions

·534 文字·2 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml

hamming number 解法メモ
#

問題Codewars サイト
#


problem description

solutions
#

solution

***自分の最初の考え方:***ある数を素因数分解し、その素因数が 2、3、5 だけかどうかを確認すればよい。
#

def is_hamming_number(num):
    """判断一个数是否是 Hamming 数"""
    while num % 2 == 0:
        num //= 2
    while num % 3 == 0:
        num //= 3
    while num % 5 == 0:
        num //= 5
    return num == 1

def generate_hamming_numbers(n):
    """生成前 n 个 Hamming 数"""
    hamming_numbers = []
    num = 1
    while len(hamming_numbers) < n:
        if is_hamming_number(num):
            hamming_numbers.append(num)
        num += 1
    return hamming_numbers

def nth_hamming_number(n):
    """查询第 n 个 Hamming 数"""
    hamming_numbers = generate_hamming_numbers(n)
    return hamming_numbers[-1] if n <= len(hamming_numbers) else None

この考え方は単純明快です。ひたすら数を走査し、素因数が 2、3、5 だけの数を見つけたらリストに入れていきます。


その後、上の solutions と自分の考え方を比べると、明らかな最適化が見えます。solutions は余計な操作をせず、直接次の Hamming number を見つけています。これができるのは、数字の規則性を簡単に分析し、少し数学的分析と数論の知識を使っているからだと思います。以下は自分なりの簡単な分析証明です。


アルゴリズムの正しさに関する自分の証明

prove_1
prove_2

最後に自分が「不可能」と思ったのは、当時は思いつかなかったからです。実際には、その数が 2、3、5 の倍数であればよい、というだけでした。

関連記事