设计一个算法,找出只含素因子2,3,5 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...(我们可以认为1也是一个丑数)
例如:
如果n = 9, 返回 10
在网上找到解法,我自己做了一点修改:
def nthUglyNumber(n):
num_list = [1]
i2 = i3 = i5 = 0
while len(num_list) < n:
num2 , num3, num5 = num_list[i2] * 2, num_list[i3] * 3, num_list[i5] * 5
# 上面一行比下面三行总耗时少
# num2 = num_list[i2] * 2
# num3 = num_list[i3] * 3
# num5 = num_list[i5] * 5
num = min(num2, num3, num5)
# 下面三个 if 还有去重的作用
if num == num2:
i2 += 1
if num == num3:
i3 += 1
if num == num5:
i5 += 1
num_list.append(num)
return num_list[-1]
思路:
丑数列表中的下一个数字,一定是之前某一个数字乘以2、或乘以3、或乘以5。
初始分别用2、3、5 乘以 1,取三个乘积中最小的 2*1;
接下来,3 和 5 还是乘以 1,而 2 可以乘以列表中的下一个数字 2,还是取三个乘积中最小的,以此类推。
如果三个乘积中,有两个相等并且是最小值,那么对应的两个数字,下一次计算时都可以乘以列表中的下一位。如上图第六行。
丑数:
只包含因子2,3,5的正整数被称作丑数。
判断方法:
首先除2,直到不能整除为止,然后除5到不能整除为止,然后除3直到不能整除为止。最终判断剩余的数字是否为1,如果是1则为丑数,否则不是丑数。(来自于百度百科)
20180105