解题思路:
(1)丑数=1+能被2,3,5整除的数;
(2)求的是第1500个丑数;
(3) 1)可以从第一个判断,如果是就加1,如果个数等于1500就输出
2)用优先队列和set集合,从1到1500进行遍历,对每个数进行乘2,3,5,把结果放到set集合中,保证每个数唯一,并放到优先队列中,易取出最值.
解题代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
typedef long long LL;
const int cof[3]={2,3,5};
int main(){
priority_queue<LL,vector<LL>,greater<LL> >p;
set<LL>s;
p.push(1);
s.insert(1);
for(int i=1;;i++){
LL x=p.top();p.pop();
if(i==1500){
cout<<"The 1500'th ugly number is "<<x<<".\n";
break;
}
for(int j=0;j<3;j++){
LL x1=x*cof[j];
if(!s.count(x1)){
s.insert(x1);
p.push(x1);
}
}
}
return 0;
}