Humble Numbers
题意: 如果一个数的质因子只有2,3,5,7,那么这个数就叫“丑数”,下现在要求前5842个“丑数”。
分析: 根据质因子分解唯一,我们知道只需要将 1分别乘上2,3,5,7,然后将得到的数在进行这样子的操作,由于原数列是递增排列的,所以可以使用优先队列维护。(在HDU上打表用了97ms,但是Vj上貌似不让交这么长的代码)
代码如下:
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <cctype>
#include <fstream>
#define INF 0x3f3f3f3f
#define TEST cout<<"stop here"<<endl
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll num[5900];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
/*
ofstream outfile;
outfile.open("data.txt");
ll j=1;
outfile<<"{"<<" ";
for(ll i=1;i<=2000000000;i++){
if(judge(i))
{outfile<< i << ','<<" ";j++;}
if(j==20){outfile<<endl;j=1;}
}
outfile<<"}"<<endl;
outfile.close();
*/
ll tmp = 1;
priority_queue<ll, vector<ll>, greater<ll> > que;
int i = 1;
while(i<=5842){
que.push(1);
while(!que.empty()){
if(i>5842)
break;
tmp = que.top();
que.pop();
if(tmp!=num[i-1]){
num[i++] = tmp;
que.push(tmp*2);
que.push(tmp*3);
que.push(tmp*5);
que.push(tmp*7);
}
}
}
int n;
while(cin>>n && n){
if(n%10==1 && n%100 != 11)
printf("The %dst humble number is %lld.\n",n,num[n]);
else if(n%10==2 && n%100!=12)
printf("The %dnd humble number is %lld.\n",n,num[n]);
else if(n%10==3 && n%100!=13)
printf("The %drd humble number is %lld.\n",n,num[n]);
else
printf("The %dth humble number is %lld.\n",n,num[n]);
}
return 0;
}