問題鏈接:UVA136 Ugly Numbers
問題簡述:不能被2、3和5以外的素數整除的數稱爲醜數,找出第1500個醜數。
問題分析:醜數的因子只能是2、3和5,不能引入其他素數,那麼,兩個數(都不爲1)相乘所得到的數字,肯定不是素數,而且也不能整除除了這兩個數之外的素數,因爲沒有因子爲該素數。即1是醜數,對於x,若x是醜數則2x、3x和5x是醜數。利用已知的醜數,從小到不斷生成醜數就可以了。
用一個STL的容器set來存放醜數,集合具有去重複,自動排序的功能,先在裏面放好了1,然後乘以2,3,5得到一個數組1,2,3,5,向後移,用2乘以2,3,5得到4,6,10,重複下去直到找到第1500個。
#include <iostream>
#include <set>
using namespace std;
set<long long> s;
int main()
{
s.insert(1);
int cnt=1;
set<long long>::iterator it=s.begin();
while(cnt<1500)
{
long long t=*it;
s.insert(2*t);
s.insert(3*t);
s.insert(5*t);
it++;
cnt++;
}
cout<<"The 1500'th ugly number is "<<*it<<endl;
return 0;
}