丑数是指不能被2,3,5以外的其他素数整除的数。把丑数从小到大排列起来,结果如下:
1,2,3,4,5,6,8,9,10,12,15,…
求第1500个丑数。
思路
题目定义的丑数,有些让人摸不着头脑。其实丑数的意思是它的公因子 只在 2,3,5,这三个质数当中。那么判断一个数是不是质数变很明确了。
bool judge(int n)
{
while(n % 2 ==0)
n=n / 2;
while (n % 3 ==0)
n= n / 3;
while (n % 5 ==0)
n= n / 5;
if( n==1 )
return true;
else
return false;
}
但是这个算法只适合判断一个数是不是丑数,如果像题目那样子的。需要另辟蹊径。
最小的丑数是1,而对于任意丑数x,2x、3x和5x也都是丑数。
CODE
#include <queue>
#include <iostream>
#include <set>
#include <vector>
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<long long> s;
pq.push(1);
s.insert(1);
for (int i = 0; ; i++)
{
ll x = pq.top(); pq.pop();
if (i == 1500)
{
cout << x << endl;
break;
}
for (int j = 0; j < 3; j++)
{
ll x2 = x * coeff[j];
if (!s.count(x2)) { s.insert(x2); pq.push(x2); }
}
}
}