**實現
編寫乙個程式,找出第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 =
1while nextdex < index:
minnum =
min(res[t2]*2
, res[t3]*3
, res[t5]*5
)#注意:這裡是使用三個while迴圈,而不用if...else...
#當上述執行到第5步時,存在兩個元素的結果相同的情況
while res[t2]*2
<= minnum:
t2 +=
1while res[t3]*3
<= minnum:
t3 +=
1while res[t5]*5
<= minnum:
t5 +=
1 nextdex +=
1return res[nextdex-1]
print
(getuglynum(10)
)
執行結果如下所示:
12
尋找第1500個醜數
諾西筆試最後一道題,題意 把只包含質因子2 3和5的數稱作醜數 ugly number 例如 2,3,4,5,6,8,9,10,12,15,等,習慣上我們把1當做是第乙個醜數。寫乙個高效演算法,返回第n個醜數。最普通 也最耗時 的做法是從1開始遍歷,然後判斷這個數的因式分解中只包含2,3,5,滿足則...
返回第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...