**:
諾西筆試最後一道題,題意:
把只包含質因子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 曾經採...