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