Ugly Numbers
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...
shows the first 10 ugly numbers. By convention, 1 is included.
Given the integer n,write a program to find and print the n'th ugly number.
Input
Each line of the input contains a postisive integer n (n <= 1500).Input is terminated by a line with n=0.
Output
For each line, output the n’th ugly number .:Don’t deal with the line with n=0.
Sample Input
1
2
9
0
Sample Output
1
2
10
#include <stdio.h>
int min(int a,int b);
int main()
{
int n,a[1505],i;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int x=0,y=0,z=0;
a[0]=1;a[1]=1;
for(i=1;i<1505;i++)
{
for(;x<i;x++)
{
if(2*a[x]>a[i-1])
break;
}
for(;y<i;y++)
{
if(3*a[y]>a[i-1])
break;
}
for(;z<i;z++)
{
if(5*a[z]>a[i-1])
break;
}
a[i]=min(a[x]*2,a[y]*3);
a[i]=min(a[i],a[z]*5);
}
printf("%d\n",a[n-1]);
}
return 0;
}
int min(int a,int b)
{
if(a>b)return b;
else return a;
}
以下为大神讲解:
赶紧来试一试。不过假设给了我们从1开始的10个丑数,怎么找出第11个呐?等等,诶,丑数不是只由2,3,5构成的嘛,而且我们拿到的数也是由2,3,5构成的,而且是最小的10个,那么第11个一定就比前十个数中的某一个多一个因子2,或者因子3,或者因子5……也就是说,第11个丑数一定是前十个丑数中某一个丑数的2倍,或者3倍,或者5倍!!
这个很关键,再仔细想一想噢。现在知道了 第11个丑数一定是前十个丑数中某一个丑数的2倍,或者3倍,或者5倍,还是不行呢,那到底是2倍还是3倍还是5倍呢o(︶︿︶)o。。。
想起来啦,我们的第十一个丑数一定是,大于第十个丑数的所有丑数中,最小的!!!那就是说,我们可以在第一到第十个丑数中找出某个丑数 a ,它的两倍刚好大于第十个丑数(刚好的意思就是,上一个数的两倍还小于第十个丑数,而它自己的两倍却大于第十个丑数了);然后再找出前十个丑数中的三倍刚好大于第十个丑数的家伙 b ;最后找出前十丑数中某丑数5倍刚好大于第十个丑数的丑数 c ~~~2*a,3*b,5*c,找出这三个中最小的就行啦(*^__^*)
上面的代码就是根据这个来的 网上还有使用map的。。。貌似也是可以的。。。
注意:用c++提交。