http://acm.hdu.edu.cn/showproblem.php?pid=1058
DP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define INT __int64
INT num[ 6000 ] ;
int min( INT a , INT b , INT c , INT d )
{
a = a < b ? a : b ;
b = c < d ? c : d ;
return a < b ? a : b ;
}
int main()
{
num[ 1 ] = 1 ;
int l1 = 1 , l2 = 1 , l3 = 1 , l4 = 1 ;
for( int i = 2 ; i <= 5892 ; ++i )
{
num[ i ] = min( num[ l1 ] * 2 , num[ l2 ] * 3 , num[ l3 ] * 5 , num[ l4 ] * 7 ) ;
if( num[ i ] == num[ l1 ] * 2 )
l1++ ;
if( num[ i ] == num[ l2 ] * 3 )
l2++ ;
if( num[ i ] == num[ l3 ] * 5 )
l3++ ;
if(num [ i ] == num[ l4 ] * 7 )
l4++ ;
}
int n ;
while( cin >> n , n )
{
if(n % 10 == 1 && n % 100 != 11)
printf("The %dst humble number is %lld.\n",n ,num[n]);
else if(n % 10 == 2 && n % 100 != 12)
printf("The %dnd humble number is %lld.\n",n ,num[n]);
else if(n % 10 == 3 && n % 100 != 13)
printf("The %drd humble number is %lld.\n",n ,num[n]);
else
printf("The %dth humble number is %lld.\n",n ,num[n]);
}
return 0 ;
}