import java.util.ArrayList;
/**
* 丑数
*
* 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。
* 求按从小到大的顺序的第N个丑数。
*/
public class JZ033GetUglyNumber {
/**
* 某个丑数肯定是前面丑数的2,3,5倍数。只需要从前往后生成即可。1,2,3,4,5,6,8,9,10,12,15,。。。。。。。
* @param index
* @return
*/
public static int GetUglyNumber_Solution(int index) {
if (index <= 0) {
return 0;
}
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
int uglg2 = 0; // list中最后一个数2的倍数所在位置,uglg2这个值(位置)加1,
int uglg3 = 0; // list中最后一个数3的倍数所在位置
int uglg5 = 0; // list中最后一个数5的倍数所在位置
while (list.size() < index) {
//每一个丑数都是前面丑数乘以2,3或者5得到的
int curMinUgly = Math.min(list.get(uglg2) * 2, Math.min(list.get(uglg3) * 3, list.get(uglg5) * 5));
list.add(curMinUgly);
if (list.get(uglg2) * 2 == curMinUgly) uglg2++; // list中最后一个数2的倍数所在位置,uglg2这个值(位置)加1,不然curMinUgly始终不变了
if (list.get(uglg3) * 3 == curMinUgly) uglg3++;
if (list.get(uglg5) * 5 == curMinUgly) uglg5++;
}
return list.get(index - 1);
}
public static void main(String[] args) {
System.out.println(GetUglyNumber_Solution(5));
}
}