HDU-1058

/*

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;
}

 

posted @ 2013-04-12 17:03  细胞核  阅读(218)  评论(0编辑  收藏  举报