經典演算法詳解(9)尋找醜數

2021-09-20 09:10:43 字數 1370 閱讀 8745

題目:我們把只含有因子2、3、5的數稱為醜數。例如6、8都是醜數,而14不是醜數,因為它含有因子7.通常也把1當做醜數。程式設計找出1500以內的全部醜數。注意:使用的演算法效率應盡量高。

c++實現:

1 #include2

3using

namespace

std;45

//判斷乙個數是否是醜數,uglynum=2*2……*2*3*3*……*3*5*5……*5組成

6int isuglynumber(int

n) 11

while (n%3==0)12

15while (n%5==0)16

19return n == 1;20

}21//方法1:逐個判斷是否是醜叔,思路簡單,但是計算冗餘,因為越到後面很多都不是醜數也在計算。

22int get_ugly_fir(int

number)

33 i++;34}

35return

count;36}

3738

//方法二:演算法效率高。

39//

40//

2分別從現有醜數中從前往後乘以醜數,找到第乙個大於當前所有醜數的值以及位置,3、5同樣如此,再把他們相乘之後的結果做對比,取最小的。

41//

下次將從上一次的位置開始往下找,這樣將不會出現冗餘,詳細見如下函式。

4243

int next_ugly(int ugly_arr, int *loc2, int *loc3, int *loc5, int *index)

47while (ugly_arr[*loc3] * 3

<= ugly_arr[*index])

50while (ugly_arr[*loc5] * 5

<= ugly_arr[*index])

53if (ugly_arr[*loc2] *2

< ugly_arr[*loc3]*3

) 56

else59}

6061

int get_ugly_sec(int

num)

74return

index;75}

7677

int main(int argc, char *ar**)

(1)說明:總共使用了兩種辦法,第一種演算法效率低,程式設計簡單,第二種演算法效率高,程式設計相對複雜。

(2)方法二思路:後面的醜數肯定是已存在的醜數乘以2、3或者5,找到比現有醜數大的且是最小的醜數作為下乙個醜數(如何找是關鍵)。用2分別從現有醜數中從前往後乘以醜數,找到第乙個大於當前所有醜數的值以及位置,3、5同樣如此,再把他們相乘之後的結果做對比,取最小的。下次將從上一次的位置開始往下找,這樣將不會出現冗餘。

64 尋找醜數

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

程式設計題目 尋找醜數

題目 我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 例如 6 8 都是醜數,但 14 不是,因為它包含因子 7。習慣上我們把 1 當做是第乙個醜數。求按從小到大的順序的第 1500 個醜數。思路 1.數字從1遞增,判斷是不是醜數 2.用2 3 5分別乘以已有的醜數,用大於當...

通過尋找醜數 初窺dp演算法

編寫乙個程式,找出第 n 個醜數。醜數就是質因數只包含 2,3,5 的正整數。示例 輸入 n 10 輸出 12 解釋 1,2,3,4,5,6,8,9,10,12 是前 10 個醜數。說明 1.1 是醜數。2.n 不超過1690。class solution i return i 1 public i...