这道题目要求求第1500个丑数,方法可能很多,这里用stl库中的优先队列和set集合会很方便解决,对于优先队列使用是个很好的练习,大体思路是如果x是丑数,那么2x,3x,5x一定也是丑数,这样就可以从1 开始向下计算,判重的话就用set集合来判断。然后每次从队列中取出最小的数,当取到第1500次时跳出循环即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
int main()
{
priority_queue<long long,vector<long long>,greater<long long> > q;
set<long long> s;
s.insert(1);
q.push(1);
long long a,b;
int j,i=1,cnt[]={2,3,5};
for(i=1;;i++)
{
b=q.top();
q.pop();
if(i==1500) break;
for(j=0;j<3;j++)
{
a=cnt[j]*b;
if(!s.count(a)){
s.insert(a);
q.push(a);
}
}
}
printf("The 1500'th ugly number is %lld.\n",b);
return 0;
}