丑数 优先队列的使用

题目描述

丑陋的数字是唯一的主要因素是2,3或5的数字。序列  
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;
}

猜你喜欢

转载自blog.csdn.net/qq_41486817/article/details/80617319