丑数(Ugly Number)是指只包含质因数2、3和5的正整数。寻找第n个丑数.
解读题目,第n个丑数一定是由前n-1个数中的某三个丑数分别乘以2,3,5所得到的小数.
定义函数如下:
函数is_ugly(num)
:用于判断一个数是否是丑数,它接受一个整数num
作为参数如果num
小于1,直接返回False
,因为丑数是正整数。然后,它遍历质因数2、3、5,通过不断地除以这些质因数来减少num
,直到num
不能被这些质因数整除。如果最终num
等于1,说明它只包含2、3、5作为质因数,返回True
;否则返回False
。
-
函数
nth_ugly_number(n)
:这个函数用于找到第n
个丑数。它接受一个整数n
作为参数,表示要找到的丑数的位置。如果n
小于或等于0,返回空列表,因为不存在负数或零个丑数。初始化一个列表uglies
,用来存储找到的丑数,初始值为[1],因为1是第一个丑数。初始化一个计数器count
,用来记录已经找到的丑数数量。初始化一个列表next_uglies
,用来存储下一个可能的丑数,初始值为[1, 2, 3],因为它们是最小的三个丑数。使用while
循环,直到找到第n
个丑数。在每次循环中,找到next_uglies
中的最小值,这是下一个丑数,将其添加到uglies
列表中,并更新计数器count
。从next_uglies
中移除已经使用过的丑数。扩展next_uglies
列表,通过将当前的丑数乘以2、3、5来生成新的丑数,并添加到next_uglies
中。保持next_uglies
列表有序,以便每次都能找到最小的下一个丑数,最后,返回uglies
列表中的最后一个元素,即第n
个丑数。
完整代码如下:
python">def is_ugly(num):if num < 1:return Falsefor prime in [2, 3, 5]:while num % prime == 0 and num > 0:num //= primereturn num == 1def nth_ugly_number(n):if n <= 0:return []uglies = [1]count = 1next_uglies = [1, 2, 3] # 初始丑数序列while count < n:# 找到下一个丑数next_ugly = min(next_uglies)uglies.append(next_ugly)count += 1# 从next_uglies中移除已经使用过的丑数next_uglies.remove(next_ugly)# 扩展next_uglies列表for prime in [2, 3, 5]:next_ugly = next_ugly * primenext_uglies.append(next_ugly)# 保持next_uglies列表有序next_uglies.sort()return uglies[-1]# 示例:找到第150个丑数
print(nth_ugly_number(150))