杭电 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]);
}
}
上一篇: vue项目启动时,npm run serve 和 npm run dev 的区别
下一篇: 棋盘覆盖