質因數只包含2、3、5中的乙個或多個的數稱為醜數
對任意的乙個醜數(除第乙個醜數 1 外)ui,必定存在乙個ut < ui,使得
ui = ut * 2 或 ut * 3 或 ut * 5,
若不成立則:
1.ui % (2|3|5) 不等於 0,ui 不是整數
2.ui % (2|3|5)等於 0,ui / (2|3|5)是醜數則, ui 也是醜數,ui / (2|3|5)不是醜數,則 ui 也不是醜數
因此,對於乙個已知的醜數序列a1,a2,...,ai(設為遞增序列):
新的醜數 ai + 1 為a1*2,a1*3,a1*5,a2 * 2,...,ai *5 中大於原醜數列表中最大值 ai 的最小的數
# coding=utf-8
"""question:
質因子只包含2、3、5中的乙個或多個數稱為醜數,要求按從小到大的順序找到第 n 個醜數
1 為第乙個醜數
"""def find_num(n):
if n < 1:
return 0
# 醜數列表初始化
num_list = [1]
t2 = t3 = t5 = 0
"""ti 的定義:
1.對任意的 t < ti, i * num_list[t] <= num_list[-1]
2.對任意的 t > ti,i * num_list[t] > num_list[-1]
"""while len(num_list) < n:
# 重新查詢 t2、t3、t5
while 2 * num_list[t2] <= num_list[-1]:
t2 += 1
while 3 * num_list[t3] <= num_list[-1]:
t3 += 1
while 5 * num_list[t5] <= num_list[-1]:
t5 += 1
return num_list[-1]
if __name__ == '__main__':
for i in range(1, 20):
print(find_num(i))
返回第n個醜數
把只包含質因子2 3和5的數稱作醜數 ugly number 例如 2,3,4,5,6,8,9,10,12,15,等,習慣上我們把1當做是第乙個醜數。寫乙個高效演算法,返回第n個醜數。解法1 判斷某個數是否為醜數,連續找到第n個醜數 include using namespace std bool ...
找到第N個醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。找到第n個醜數 方法1 存放num之前所有元素是否是醜數的flag int getuglynumber solution in...
求第N個醜數
原問題描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。這個題不是很難,基本上看完題就能想出解法,但是要想出時間複雜度為o n 的解法還是有點難度的。我最開始的解法時...