码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1058 Humble Numbers(构造?枚举?)

时间:2015-01-25 00:02:21      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

题意:

一个数的质因子如果只是2,3,5,7中的若干个。则这个数叫做humble number。

例如:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ...

给n,问第n个humble number是多少。

 

思路:

所有的humble数的构造都是:(2^a)*(3^b)*(5^c)*(7^d)。a,b,c,d大于等于0。

X=a+b+c+d代表这个数是第X个humble数。

假设前i-1个humble数已经求出来了,第i个humble数如何求呢?

一定是前i-1个humble数中的某个humble数乘以2或乘以3或乘以5或乘以7得到的。

好了,枚举前i-1个humble数,找出大于第i-1个humble数并且是最小,那么它就是第i个humble数了。

看代码

 

代码:

ll a[5850];
int cn=0;

int main(){

    a[1]=1;
    cn=1;

    while(cn<5842){
        ll ans=INF;
        ll temp;
        rep(i,1,cn){
            temp=a[i]*2;    if(temp>a[cn]) ans=min(ans,temp);
            temp=a[i]*3;    if(temp>a[cn]) ans=min(ans,temp);
            temp=a[i]*5;    if(temp>a[cn]) ans=min(ans,temp);
            temp=a[i]*7;    if(temp>a[cn]) ans=min(ans,temp);
        }
        a[++cn]=ans;
    }

    int n;
    while(scanf("%d",&n),n){
        int t=n%10;
        if(t==1 && n%100!=11){
            printf("The %dst humble number is ",n);
        }
        else if(t==2 && n%100!=12){
            printf("The %dnd humble number is ",n);
        }
        else if(t==3 && n%100!=13){
            printf("The %drd humble number is ",n);
        }
        else{
            printf("The %dth humble number is ",n);
        }
        printf("%I64d.\n",a[n]);
    }

    return 0;
}

 

hdu 1058 Humble Numbers(构造?枚举?)

标签:

原文地址:http://www.cnblogs.com/fish7/p/4246743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!