题意:题目意思是求由2,3,5的乘积组成的数从大到小排列,从1开始,2,3,4,5,6,8,9,。。。
分析:基本思想是设3个指针,分别表示3个素数乘到哪了,然后通过比较3个指针位置的递推结果来确定下一个数是什么。
//172K 0MS
#include <stdio.h>
#define MIN(a,b) ((a)<(b)?(a):(b))
#define N 1502
int num[N] ;
void Find_Ugly_Numbers ( )
{
int p2 , p3 , p5 ;
num[1] = 1 ;
p2 = p3 = p5 = 1 ;
int i ;
for ( i = 2 ; i <= 1500 ; i ++ )
{
int t2 , t3 , t5 ;
t2 = num[p2] * 2 ;
t3 = num[p3] * 3 ;
t5 = num[p5] * 5 ;
num[i] = MIN(MIN(t2,t3),t5) ;
if ( num[i] == t2 )
{
p2 ++ ;
}
if ( num[i] == t3 )
{
p3 ++ ;
}
if ( num[i] == t5 )
{
p5 ++ ;
}
}
}
int
main ( )
{
Find_Ugly_Numbers ( ) ;
int n ;
while ( EOF != scanf ("%d" , & n ) )
{
if ( 0 == n )
{
break ;
}
printf ("%d\n" , num[n] ) ;
}
}