问题:
我们把只包含因子2,3和5的数称作为丑数。
1
,
2
,
3
,
4
,
5
,
6
,
8
,
9
,
10
,
12
,
15
,
⋯
1,2,3,4,5,6,8,9,10,12,15,\cdots
1,2,3,4,5,6,8,9,10,12,15,⋯求按从小到大的顺序的第1500个丑数。
解决:
#include<iostream>
#include<vector>
#include<queue> //priority_queue
#include<set>
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(); //最小数优先top,然后优先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;
}