解题思路:1是最小的丑数,对于每一个丑数x:2x,3x,5x同样也是丑数。可以定义一个优先队列,先将1存入其中,然后每次取出队列中最小的一个数,乘以2,3,5再放入队列和集合中,循环1500次,并打印第1500个数。
题目描述:Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...
shows the first 11 ugly numbers. By convention, 1 is included.
Write a program to find and print the 1500’th ugly number.
#include<cstdio>
#include<queue>
#include<set>
#include<iostream>
using namespace std;
typedef long long LL;
priority_queue<LL,vector<LL>,greater<LL> > Q;
set<LL> S;
int a[3]={2,3,5};
int main()
{
S.insert(1);
Q.push(1); //先将1存入队列 。
for(int i=1;i<=1500;i++)
{
LL tmp=Q.top();
Q.pop();
if(i==1500) //队列第1500个最小的数即为所求答案 。
{
cout<<tmp<<endl;
break;
}
for(int j=0;j<3;j++) //每一个拿出的数乘以2,3,5.
{
if(S.count(a[j]*tmp)==0)
{
Q.push(a[j]*tmp);
S.insert(a[j]*tmp);
}
}
}
return 0;
}