题目描述
丑陋的数字是唯一的主要因素是2,3或5的数字。序列
1,2,3,4,5,6,8,9,10,12 ......
显示前10个丑陋的数字。按照惯例,1包括在内。
给定整数n,写一个程序来查找并打印第n个丑陋的数字。
1,2,3,4,5,6,8,9,10,12 ......
显示前10个丑陋的数字。按照惯例,1包括在内。
给定整数n,写一个程序来查找并打印第n个丑陋的数字。
输入
输入的每一行都包含一个后缀整数n(n <= 1500)。输入由n = 0的行终止。
输出
对于每一行,输出第n个丑陋的数字:不要处理n = 0的行。
样例输入
1
2
9
0
样例输出
1
2
10
思路:
如果x是丑数,则2x,3x,5x都是丑数;不停的放出优先队列;(注意避免重复,与优先队列中数进行比较)并取出队头(最小的数)x;要判断这个数是否已经访问过;
算法实现:
#include <iostream>
#include <queue>
#include <set>
using namespace std;
typedef long long LL;
int main(){
int k;
while(cin>>k)
{
if(k==0)break;
LL x,x2;
priority_queue<LL,vector<LL>,greater<LL> > mm;
set<LL> n;
int i,j,factor[3]={2,3,5}; //列数组来存储因子
mm.push(1);
n.insert(1);
for(i=1;;i++)
{
x=mm.top();
mm.pop();
if(i==k){
cout<<x<<endl;
break;
}
for(j=0;j<3;j++)
{
x2=x*factor[j];
if(!n.count(x2)) //判断所得的数是否已算出 避免重复
{
n.insert(x2);
mm.push(x2);
}
}
}
}
return 0;
}