【Codewars python 4kyu】: Hamming Numbers

本文介绍了汉明数的概念,即形如2^i * 3^j * 5^k的正整数,并提供了一个Python函数来计算第n个最小的汉明数。文章通过举例展示了前几个汉明数,并强调代码应能快速计算出前5000个(Clojure: 2000)汉明数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

A *Hamming number* is a positive integer of the form 2i3j5k, for some non-negative integers ij, and k.

Write a function that computes the nth smallest Hamming number.

Specifically:

  • The first smallest Hamming number is 1 = 203050
  • The second smallest Hamming number is 2 = 213050
  • The third smallest Hamming number is 3 = 203150
  • The fourth smallest Hamming number is 4 = 223050
  • The fifth smallest Hamming number is 5 = 203051

The 20 smallest Hamming numbers are given in example test fixture.

Your code should be able to compute all of the smallest 5,000 (Clojure: 2000) Hamming numbers without timing out.

代码实现:

#codewars第二十题(超时)
def hamming(n):
    if n <= 6: return n
    my_res = [1,2,3,4,5,6]
    for i in range(6,n):
        j = my_res[i-1] + 1
        now_j = j
        while j > 0:
            if (j/2 == 1) or (j/3 == 1) or (j/5 == 1):
                my_res.append(now_j)
                break
            elif j/2 != 1 and (j/2).is_integer():
                j = j/2
            elif j/3 != 1 and (j/3).is_integer():
                j = j/3
            elif j/5 != 1 and (j/5).is_integer():
                j = j/5
            else:
                now_j += 1
                j = now_j
    return now_j

#另解
def hamming(limit):
    h = [1] * limit
    x2 = 2
    x3 = 3
    x5 = 5
    i = j = k = 0
 
    for n in range(1, limit):
        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]

#另解
def hamming(n):
    bases = [2, 3, 5]
    expos = [0, 0, 0]
    hamms = [1]
    for _ in range(1, n):
        next_hamms = [bases[i] * hamms[expos[i]] for i in range(3)]
        next_hamm = min(next_hamms)
        hamms.append(next_hamm)
        for i in range(3):
            expos[i] += int(next_hamms[i] == next_hamm)
    return hamms[-1]

#判断浮点数是否为整数(两种方法)
(3/2).is_integer() 
(2/2) - (int(2/2)) == 0

hamming(18)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值