
//重在理解方法:每次找到最小的 2 3 5 7 的因子數(shù),之后利用所存數(shù)的下標(biāo)的關(guān)系改變

#include <iostream>

using namespace std;


int num[5843]; //存儲(chǔ)前5842個(gè)丑數(shù)


int find_min ( int a, int b, int c, int d )

{

int temp = a < b ? a : b;

int index = c < d ? c : d;

return temp < index ? temp : index;

}


void solve ( )

{

int i1, i2, i3, i4, i;

int h1, h2, h3, h4;

i1 = i2 = i3 = i4 = 1;

num[1] = 1;

for (i = 2; i < 5843; i ++ )

{
h1 = num[i1] * 2;
h2 = num[i2] * 3;
h3 = num[i3] * 5;
h4 = num[i4] * 7;
int min = find_min ( h1, h2, h3, h4 );
num[i] = min;

//易錯(cuò)點(diǎn):這里不可以用else if 因?yàn)閠i中可能會(huì)有相同的最小值,如當(dāng):min = 6 時(shí)

if ( min == h1 )

i1 ++;

if ( min == h2 )

i2 ++;

if ( min == h3 )

i3 ++;

if ( min == h4 )

i4 ++;

}

}


int main ()

{

solve ();

int n;

while ( scanf ("%d", &n), n )

{

if ( n % 100 != 11 && n % 10 == 1 )

printf ("The %dst humble number is %d.\n", n, num[n]);

else if ( n % 100 != 12 && n % 10 == 2 )

printf ("The %dnd humble number is %d.\n", n, num[n]);

else if ( n % 100 != 13 && n % 10 == 3 )

printf ("The %drd humble number is %d.\n", n, num[n]);

else

printf ("The %dth humble number is %d.\n", n, num[n]);

}

//system ("pause");

return 0;

}
