1、題目要求:
我們把只包含因子2、3和5的數稱作丑數(Ugly Number),求按從小到大的順序的第1500個丑數。例如6、8都是丑數,但14不是,因為它包含因子7。習慣上我們把1當做第一個丑數。
提示:丑數= (x、y、z大於等於0的整數)
輸出第1500個丑數。
2、設計思路:
傳統方法(1)通過創建循環,連續%2、%3、%5得出最后的余數。
(2)如果最終的余數為0,即可確定最終的丑數。
(3)確定丑數的過程中加入變量限定丑數的個數即可。
改進方法(1)選取最小丑數1,將其分別乘2/3/5得到對應的新丑數。
(2)分別用三個變量來表示最近一個丑數*2/*3/*5得到的丑數
(3)當三個變量中其中的最小值被選作丑數時,該數應該自增,方便下次作為索引值繼續乘對應的數據,避免數據重復乘法運算
3、源代碼:
package cn.test.termtest.uglynumber; public class Ugly { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(GetUglyNumber1(1500)); } public static int GetUglyNumber1(int index) { if(index <7) return index; int ugly[] = new int[index]; //定義一個數組,用來存放每一個元素。 ugly[0] =1; //第一個丑數 int m2 =0; //最近一次乘2得到的丑數 int m3 =0; int m5 =0; for(int i=1; i< index;i++) { ugly[i] = Math.min(ugly[m2] * 2,Math.min(ugly[m3] * 3,ugly[m5] * 5)); if(ugly[i]==ugly[m2] * 2) m2++; if(ugly[i]==ugly[m3] * 3) m3++; if(ugly[i]==ugly[m5] * 5) m5++; } return ugly[index - 1]; } }
