public class 丑数 {
public static void main(String[] args) {
int result;
result = new 丑数().GetUglyNumber_Solution(7);
System.out.println(result);
}
public int GetUglyNumber_Solution(int index) {
//获得第index个丑数
//把只包含质因子2、3和5的数称作丑数(Ugly Number)。
if(index <= 0 ){
return 0;
}
//1是第一个丑数 根据丑数的性质 每个丑数分别乘2 乘3 乘5 所得仍是丑数
//维护三个下标 分别用于乘2 3 5 每次选择最小的加入丑数集合 被选择的下标加1
int p2 = 0;
int p3 = 0;
int p5 = 0;
int[] uglyNum = new int[index];
uglyNum[0] = 1;//第一个丑数是1
for (int i = 1; i < index; i++) {
//每次放入最小的丑数
uglyNum[i] = Math.min(uglyNum[p2]*2,Math.min(uglyNum[p3]*3,uglyNum[p5]*5));
//下标右移
if (uglyNum[i] == uglyNum[p2]*2) p2++;
if (uglyNum[i] == uglyNum[p3]*3) p3++;
if (uglyNum[i] == uglyNum[p5]*5) p5++;
}
return uglyNum[index-1];
}
}