原来这种方法叫打表。
假设a[n]表示第n个这样的数,则a[1]=1,显然,更大的丑数只能由小的丑数通过乘以2,3,5得到.维护三个头指针,一个尾指针.头指针h1,h2,h3分别指向a[h1],a[h2],a[h3]分别乘以2,3,5能够比目前得到的最大丑数稍大的最小丑数,尾指针则指向目前最大的丑数.显然,如果乘积小于最大的丑数,那就将头指针后移.否则选择三个值中最小的那个加入队尾,直到尾指针到达目标.
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define MAX_POS 1500
int myMin(int a,int b,int c)
{
int min;
min=a<b?a:b;
min=min<c?min:c;
return min;
}
int main()
{
int ugly[MAX_POS+1],i;
int value2,value3,value5;
int p2,p3,p5;
int n;
p2=p3=p5=1;
ugly[1]=1;
for(i=2;i<=MAX_POS;i++)
{
value2=ugly[p2]*2;
value3=ugly[p3]*3;
value5=ugly[p5]*5;
ugly[i]=myMin(value2,value3,value5);
if(ugly[i]==value2) p2++;
if(ugly[i]==value3) p3++;
if(ugly[i]==value5) p5++;
}
while(scanf("%d",&n)&&n)
{
printf("%d\n",ugly[n]);
}
return 0;
}