劍指offer面試題目 醜數

2021-08-04 11:54:36 字數 1285 閱讀 5772

把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。

習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

輸入:

輸入包括乙個整數n(1<=n<=1500)。

輸出:

可能有多組測試資料,對於每組資料,

輸出第n個醜數。

方法一:

最簡單的思路是,從1開始驗證每乙個數是不是醜數,直到找到要求的那乙個。

if(number%2 == 0)else

if(number%3 == 0)else

if(number%5 == 0)else

return

number==1?true:false;

}

可是這種思路,會浪費大量的時間,最後就會超時。

方法二:

我們考慮乙個陣列,陣列儲存的是當前的醜數,以後的每個醜數,都是用之前的陣列的元素相乘的來的。接下來就是如何得到後面的醜數並保證它是有序的。

可以想到,陣列的第乙個元素是1,1與2 3 5分別相乘,可以得到三個值,這三個值裡面最小的,肯定就是下乙個醜數的最大值,接著max2的下標後移,繼續比較。

void mkuglynumber()

}

比如,當前的陣列元素只是1,那麼與2 3 5 相乘得到2 3 5,顯然得到的最小值是2。陣列元素變為1 2。下標這回變為2 1 1,繼續與2 3 5相乘,得到4 3 5,找出其中最小的,再放進陣列,元素變為1 2 3。繼續,直到找到1500個醜數之後,每次進行讀取醜數即可。

#include 

#define maxsize 1500

void mkuglynumber();

int getmin(int max2,int max3,int max5);

int garr[maxsize];

int top;

int main()

return0;}

void mkuglynumber()

}int getmin(int max2,int max3,int max5)

劍指Offer 面試題34 醜數

我們把只包含因子2 3和5的數成為醜數,求按從小到大的順序的第1500個醜數。例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做第乙個醜數。分析 逐個判斷整數是不是醜數,直觀但是效率低下。根據醜數的定義,醜數只能被2 3和5整除,也就是說乙個數能被2整除,我們把它連續除以2 如果能...

劍指offer面試題 34 醜數

題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路分析 思路一 逐個判斷每個整數是不是醜數的解法,直觀但不高效 牛客網測試超時 所謂乙個數m是另乙個數n的因子,是...

劍指offer 面試題49 醜數

我們把只包含因子2 3 和 5 的數稱作醜數 ugly number 求按照從小到大的順序的第1500個醜數。例如,6 8都是醜數,但是14不是,因為它包含因子7。習慣上我們把1當做第乙個醜數。有空再補上 public class 49 uglynumber return uglynumbers i...