尋找第1500個醜數

2021-06-13 20:40:49 字數 1163 閱讀 9269

**:

諾西筆試最後一道題,題意:

把只包含質因子2、3和5的數稱作醜數(ugly number),例如:2,3,4,5,6,8,9,10,12,15,等,習慣上我們把1當做是第乙個醜數。

寫乙個高效演算法,返回第n個醜數。

最普通(也最耗時)的做法是從1開始遍歷,然後判斷這個數的因式分解中只包含2,3,5,滿足則找到了乙個,一直找下去,直到第n個被找出!測試了一下,找第1500個醜數耗時40秒!

分析:假設陣列ugly[n]中存放不斷產生的醜數,初始只有乙個醜數ugly[0]=1,由此出發,下乙個醜數由因子2,3,5競爭產生,得到ugly[0]*2, ugly[0]*3, ugly[0]*5, 顯然最小的那個數是新的醜數,所以第2個醜數為ugly[1]=2,開始新一輪的競爭,由於上一輪競爭中,因子2獲勝,這時因子2應該乘以ugly[1]才顯得公平,得到ugly[1]*2,ugly[0]*3,ugly[0]*5

, 因子3獲勝,ugly[2]=3,同理,下次競爭時因子3應該乘以ugly[1],即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5獲勝,得到ugly[3]=5,重複這個過程,直到第n個醜數產生。總之:

每次競爭中有乙個(也可能是兩個)因子勝出,下一次競爭中 勝出的因子就應該加大懲罰!

程式如下所示(只要把程式中的因子改一下就可以得到新的題目),耗時忽略不計:

執行結果:第1500個醜數:859963392, 第1691個醜數2 125 764 000,第1692個醜數就越界了。

int表示的最大整數是2,147,483,647,可由std::cout<<(std::numeric_limits::max)()<<"\n";給出!

[cpp]view plain

copy

#include 

using

namespace

std;  

intmymin(

inta, 

intb, 

intc)  

intfindugly(

intn) 

//  

intresult = ugly[n-1];  

delete

ugly;  

return

result;  

}  int

main()  

找到第1500個醜數

把只包含質因子2 3和5的數稱作醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第1500個醜數。暴力的一點的方法,可以從1開始遍歷,依次判斷是否是醜數,如果是醜數,計數器 1,當計數器加到1500的時候,這個數字就是醜數了.void v...

尋找第n個醜數

實現 編寫乙個程式,找出第n個醜數。乙個數的因子僅僅包括2,3,5的數稱為醜數。說明1 數字1特別對待也看作是醜數。說明2 從1開始的10個醜數分別為1,2。3。4,5,6,8,9。10。12。該題理解的關鍵之處在於 從醜數分解出來的因子,一定是乙個醜數,即醜數一定是由醜數相乘得到的。所以,醜數的2...

64 尋找醜數

64.尋找醜數。題目 我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 例如 6 8 都是醜數,但 14 不是,因為它包含因子 7。習慣上我們把 1 當做是第乙個醜數。求按從小到大的順序 的第 1500 個醜數。分析 這是一道在網路上廣為流傳的面試題,據說 google 曾經採...