把只包含因子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...