版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
贴上题目链接UVa136
分析:丑数即指不能被2,3,5以外的其他素数整除的数,把丑数从小到大排列,求第1500个丑数。题目有很多方法,暴力法不用考虑,铁定超时,我们采用从小到大逐个生成丑数的方式。最小的丑数是1,(我其实有点疑惑,1可以被2,3,5整除吗?可是问题列举出来的第一个就是1。。)而对于任意丑数x来说,2x、3x、5*x也都是丑数。这样,就可以用一个优先队列保存所有已经生成的丑数,每次取出最小的丑数,生成三个新的丑数,但是需要判断这个丑数是否已经生成过。代码如下:
#include <iostream>
#include <cstdio>
#include <set>
#include <sstream>
#include <string>
#include <typeinfo>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <queue>
using namespace std;
typedef long long LL;
const int coeff[3]={2,3,5};
int main()
{
priority_queue<LL,vector<LL>,greater<LL> > pq;
set<LL>s;
pq.push(1);
s.insert(1);
for(int i=1;;i++)
{
LL x=pq.top();pq.pop();
if(i==1500){
cout<<"The 1500'th ugly number is "<<x<<".\n";
break;
}
for(int j=0;j<3;j++)
{
LL x2=x*coeff[j];
if(!s.count(x2)){
s.insert(x2);
pq.push(x2);
}
}
}
return 0;
}