/*
简单DP:每次将求得的值分别乘以2,3,4,7,然后利用插入排序插入到数据序列中
保证数据的递增序,最终到达结束状态。
*/


1 #include <iostream>
2 #include <cstdlib>
3 #include <stdio.h>
4
5 using namespace std;
6
7 long long data[ 6000 ] = {0,1,2,3,5,7};
8
9 bool bs( int l, int h, long long key )
10 {
11 while ( l <= h ) {
12 int mid = (l+h)/2;
13 if ( data[ mid ] == key )
14 return true;
15 else if ( data[ mid ] > key )
16 h = mid-1;
17 else l = mid+1;
18 }
19 return false;
20 }
21
22 int main()
23 {
24 int save = 6,move = 2;
25 while ( move < save && save < 6000 ) {
26 for ( int i = 2 ; i <= move ; ++ i ) {
27 data[ save ] = data[ move ]*data[ i ];
28 if ( data[ save ] <= 2000000000 && !bs( 1, save-1, data[ save ] ) ) {
29 int now = save ++;
30 while ( data[ now ] < data[ now-1 ] ) {
31 swap( data[ now ], data[ now-1 ] );
32 -- now;
33 }
34 }
35 }
36 ++ move;
37 }
38 int n;
39 while ( scanf("%d",&n) && n ) {
40 cout << "The " << n;
41 if ( n%10 == 1 && n%100 != 11 )
42 cout << "st";
43 else if ( n%10 == 2 && n%100 != 12 )
44 cout << "nd";
45 else if ( n%10 == 3 && n%100 != 13 )
46 cout << "rd";
47 else
48 cout << "th";
49 cout << " humble number is " << data[ n ] << "." << endl;
50 }
51 return 0;
52 }