1. 程式人生 > >例題 5-7 醜數

例題 5-7 醜數

醜數:指包含因子2,3,5的正整數被稱作醜數,比如4,10,12都是醜數,而7,23,111則不是醜數,另外1也是醜數。

最小的醜數是1,而對於任意醜數x,2x,3x和5x 也都是醜數。

題:醜數從小到大排列,求第1500個醜數(859963392)

#include<iostream>
#include<vector>
#include<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();
		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;
}

列印醜數:

#include<iostream>
#include<vector>
#include<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<150;i++){
		LL x=pq.top();
		cout<<x<<endl;
		pq.pop();
		for(int j=0;j<3;j++){
			LL x2=x*coeff[j];
			if(!s.count(x2)){
				s.insert(x2);
				pq.push(x2);
			}
		}
	}	
	return 0;
}