寻找第n个丑数

应用案例

编写一个程序,找出第n个丑数。

案例分析

丑数的概念

一个数的因子仅仅包括2,3,5的数称为丑数。

说明1:数字1特别对待也看作是丑数。
说明2:从1开始的10个丑数分别为1,2。3。4,5,6,8,9。10。12。

过程分析

该题理解的关键之处在于:从丑数分解出来的因子,一定是一个丑数,即丑数一定是由丑数相乘得到的。所以,丑数的2,3,5倍均是一个丑数。

所以该题的核心为:默认第一个丑数是1,用第一个丑数 1 做 1×2;1×3;1×5;从这三个数字中选择一个最小的即为第二个丑数,结果是2;然后分别求第一个丑数和第二个丑数的2/3/5倍(除去已有的丑数2),取最小的作为第三个丑数;以此类推,求每个丑数的2/3/5倍,并作比较取最小的。

具体分析过程如下图:
在这里插入图片描述

代码实现

def getUglyNum(index):
    if index < 1:
        return 0

    #默认第一个丑数
    res = [1]

    #t2、t3、t5是丑数列表res的下标
    t2 = t3 = t5 = 0
    nextdex = 1

    while nextdex < index:
        minNum = min(res[t2] * 2, res[t3] * 3, res[t5] * 5)
        res.append(minNum)

        #注意:这里是使用三个while循环,而不用if...else...
        #当上述执行到第5步时,存在两个元素的结果相同的情况
       
        while res[t2] * 2 <= minNum:
            t2 += 1
        while res[t3] * 3 <= minNum:
            t3 += 1
        while res[t5] * 5 <= minNum:
            t5 += 1
        nextdex += 1
    return res[nextdex-1]
print(getUglyNum(10))

执行结果如下所示:

12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值