剑指offer:丑数

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        if index==0:
            return 0
        index2=0
        index3=0
        index5=0
        ugly=[1]
        for i in range(index-1):
            newugly=min([2*ugly[index2],3*ugly[index3],5*ugly[index5]])
            ugly.append(newugly)
            if newugly%2==0:
                index2+=1
            if newugly%3==0:
                index3+=1
            if newugly%5==0:
                index5+=1
        return ugly[-1]

由题可知,丑数的因子只有2,3,5,说明丑数是由2,3,5的幂次乘积得来的,例如8=2*2*2。第一个丑数是1,那么后面由1得来的丑数就是1*2=2,1*3=3,1*5=5,2又产生了三个丑数:2*2=4,2*3=6,2*5=10。也就是说,每生成一个丑数,它在后面也会相应的产生三个丑数。

上面的规律找到了,但是我们想让丑数从小到大一点点递增上去,实际上:

ugly=2^x*3^y*5^z

那么我们让它一点点的去乘2,乘3,乘5,去看看哪个数小,就达到了让丑数一点一点增加的效果,为此使用了三个index来计数ugly中的x,y,z分别是多少,之后再分别乘2,乘3,乘5,也就是x+1,y+1,z+1,这样就比价好理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值