求第n个丑数
我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
例: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
思路:将前面求得的丑数记录下来,后面的丑数就是前面的丑数*2,*3,*5,已知前面k-1个丑数,采取用三个指针的方法p2,p3,p5,这里p2指向的数字下一次永远乘2,p3指向的数字下一次永远乘3,p5指向的数字永远乘5,从2p2 ,3p3 ,5p5选取最小的一个数字,作为第k个丑数。
int Min(int a, int b, int c){
int m = a < b ? a : b;
return m < c? m : c;
}
int nthUglyNumber(int n) {
if( n == 1) return 1;
int data[n+1];
data[1] = 1;
int p2, p3, p5;
p2 = p3 = p5 = 1;
for(int i = 2; i <= n; ++i){
data[i] = Min(data[p2]*2, data[p3]*3, data[p5]*5);
if(data[p2]*2 == data[i]){
p2++;
}
if(data[p3]*3 == data[i]){
p3++;
}
if(data[p5]*5 == data[i]){
p5++;
}
}
return data[n];
}