跳过正文
  1. Posts/

hamming_number_solutions

·468 字·1 分钟· 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的倍数就行了的。

相关文章