/* f[1] = 1; f[2] = min(f[1]*2,f[1]*3,f[1]*5,f[1]*7) = 2; f[3] = min(f[2]*2,f[1]*3,f[1]*5,f[1]*7) = 3; f[4] = min(f[2]*2,f[2]*3,f[1]*5,f[1]*7) = 4; f[5] = min(f[3]*2,f[2]*3,f[1]*5,f[1]*7) = 5; f[6] = min(f[3]*2,f[2]*3,f[2]*5,f[1]*7) = 6; | | f[7] = min(f[4]*2,f[3]*3,f[2]*5,f[1]*7) = 7; f[8] = min(f[4]*2,f[3]*3,f[2]*5,f[2]*7) = 8; f[9] = min(f[5]*2,f[3]*3,f[2]*5,f[2]*7) = 9; f[10] = min(f[5]*2,f[4]*3,f[2]*5,f[2]*7) = 10; | | f[11] = min(f[6]*2,f[4]*3,f[3]*5,f[2]*7) = 12; ............ */ #include <cstdio> #include <cstdlib> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int min_num(int a,int b,int c,int d) { a = a<b?a:b; c = c<d?c:d; return a<c?a:c; } int main() { int f[5900]; int n; f[1] = 1; int l,k,m,s; l=1;k=1;m=1;s=1; for(int i=2;i<=5842;i++) { f[i] = min_num(f[l]*2,f[k]*3,f[m]*5,f[s]*7); if(f[i] == f[l]*2) l++; if(f[i] == f[k]*3) k++; if(f[i] == f[m]*5) m++; if(f[i] == f[s]*7) s++; } while(scanf("%d",&n),n!=0) { if(n%10==1 && n%100!=11) printf("The %dst humble number is %d.\n",n,f[n]); else if(n%10==2 && n%100!=12) printf("The %dnd humble number is %d.\n",n,f[n]); else if(n%10==3 && n%100!=13) printf("The %drd humble number is %d.\n",n,f[n]); else printf("The %dth humble number is %d.\n",n,f[n]); } //printf("%d",min_num(87,9,7,7)); return 0; }