找出第n個醜數

2021-08-25 14:28:20 字數 1111 閱讀 3138

問題描述:

設計乙個演算法,找出只含素因子2,3,5 的第 n 小的數。

符合條件的數如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…

樣例如果n = 9, 返回 10

挑戰要求時間複雜度為o(nlogn)或者o(n)

注意事項

我們可以認為1也是乙個醜數

方法一:可以遍歷每乙個數,當它是醜數時,計數加1,直到它是第n個醜數。

而醜數的判斷是:2^i *3^j *5*k。因此。首先整除2,直到不能整除為止,然後整除3,直到不能整除為止,然後整除5,直到不能整除為止。若是醜數,則能依次整除,那麼最後得到的結果是1;如果不是醜數,則不能整除完,得到的結果不是1。

該方法所需時間較長,因為是遍歷每個整數,不是醜數的也進行了整除判斷。**如下:

class solution

returnm;}

方法二:該方法是想由較小的醜數得到後面的醜數,這樣得到乙個醜數陣列,其中的醜數是按從小到大的順序排列的。從而跳過非醜數的判斷,節省了時間,但由於要建立乙個n個元素的陣列,浪費了空間。具體思路為:

首先定義乙個陣列存放醜數,認為1是醜數,則初始化陣列num[0] = 1,然後從2,3,5這三個種子中挑選,選擇num[0]*2,num[0]*3,num[0]*5中最小的數為新的醜數,顯然應該選擇2,即num[1] = 2,然後從num[1]*2,num[1]*3,num[1]*5,num[0]*3,num[0]*5中進行選擇,由於陣列時按從小到大排列的,顯然只用考慮num[1]*2,num[0]*3,num[0]*5,而不用考慮num[1]*3,num[1]*5,選擇3,即num[2] = 3,依次進行操作。我們可以看到,當*2被選出了一次,則下次進行比較的時候,它的idx_2就加一,對*3和*5一樣,這樣相當於將所有已經得到的醜數都乘以了2

35,然後比較最小值,只是每次只需要三個數進行比較,因為同乙個*2的醜數,根據idx_2就知道它們的大小。 **如下:

class solution

int result=ugly[n-1];

delete ugly;

return result;

}};

編寫乙個程式,找出第 n 個醜數。

編寫乙個程式,找出第 n 個醜數。醜數就是只包含質因數 2,3,5 的正整數。示例 輸入 n 10 輸出 12 解釋 1,2,3,4,5,6,8,9,10,12 是前 10 個醜數。說明 1 是醜數。n 不超過1690。題目鏈結 解題思路 任意乙個醜數一定是另乙個醜數乘以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...