欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

杭电 oj Humble Numbers 1058

程序员文章站 2022-05-13 17:18:32
...

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:题目是让找出第N个Humble Number,定义是除1外所有仅有2,3,5,7因子的数。
分析:嗯嗯,就是每次让排在前面的数乘以2,3,5,7,这样得出来的数就肯定是素数因子只有2,3,5,7啦
这样的话就要涉及到排序,并且就算是这样的话,也是一头雾水啊,并不知道怎么做,但是要是事先排好序的话就不一样了,怎么可能。。。。。。。其实是可以的,让每一个数据分别乘以2,3,5,7,然后挑出最小的就可以了啊,哦,nice,
但是并不是求出最小的,就把其他的数据扔了,这样是不行的,那就把这些数据留到下一轮继续判断,恩,就是这样

代码如下:

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define req(i,l,r) for(int i=(l);i<=(r);i++)
#define mem(a,b) memset(a,b,sizeof(a))
#define op operator
#define endl "\n"
#define MIN_SUM 0x80000000  
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
template<typename Q>
void inin(Q &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    x=f?-x:x;
}
ll data[5850];
void init(){
    int i,j,m,n,index;
    i=j=m=n=index=1;
    data[index]=1;
    while(1){
        if(index==5843){
            break;
        }
        ll temp1=min(data[i]*2,data[j]*3);
        ll temp2=min(data[m]*5,data[n]*7);
        ll ans=min(temp1,temp2);
        if(ans!=data[index]){
            data[++index]=ans;
        }
        if(ans== data[i]*2) i++;
        else if(ans== data[j]*3) j++;
        else if(ans== data[m]*5) m++;
        else if(ans== data[n]*7) n++;
    }
}
int main(){
    int n;
    //这种题目看上去应该是事先打表,而后查询吧
    init();
    while(scanf("%d",&n)==1&&n){

         if(n%10==1 && n%100!=11) 
            printf("The %dst humble number is %lld.\n",n,data[n]);
        else if(n%10==2 && n%100!=12)
            printf("The %dnd humble number is %lld.\n",n,data[n]);
        else if(n%10==3 && n%100!=13)
            printf("The %drd humble number is %lld.\n",n,data[n]);
        else
            printf("The %dth humble number is %lld.\n",n,data[n]);

    }
} 
相关标签: 杭电