1. 程式人生 > >136 Ugly Numbers (有關set使用的一道題)

136 Ugly Numbers (有關set使用的一道題)

Ugly numbers are numbers whose only prime factors are 2, 3 or 5.

 The sequence1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...

shows the first 11 ugly numbers.

 By convention, 1 is included.Write a program to find and print the 1500’th ugly number.

Input

There is no input to this program.

Output

Output should consist of a single line as shown below, with ‘’ replaced by the numbercomputed.

Sample OutputThe 1500'th ugly number is .

把只包含因子2、3和5的數稱作ugly numbers

例如6、8都是醜數,但20不是,因為它包含因子4。

本題要求輸出第1500個醜數,用set直接判重輸出

WA了一次發現UVA不支援#include<buts/stdc++.h>…………

set的用法:set<型別>名字;
例如set<int>se;set<string>se;
自己定義的結構體什麼的也可以往裡面塞

基本操作對集合a中元素的有
插入元素:a.insert(1);
刪除元素(如果存在):a.erase(1);
判斷元素是否屬於集合:if(a.find(1)!=a.end())
返回集合元素的個數:a.size()
將集合清為空集 :a.clear ()


set可以解決去重和排序問題。
set中每個元素最多隻出現一次
set中的元素已經從小到大排序好
如何通過迭代器從小到大遍歷所有元素 
for (set<string>::iterator i = d.begin(); i != d.end(); i++)  
cout << *i << endl;  

#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;  

  
set<long long>a;  
int ref[3]={2,3,5};  
int main()  
{      
    int m=1;  
    a.insert(1);//預設1位第一個醜數  
    set<long long>::iterator it=a.begin();
	//set<long long>::iterator it;一樣的
	//迭代器物件代表容器中的確定的地址 ,理解成將a這個容器的首地址給了it 
    while(m<=1600)  
    {  
        it=a.begin();  
        for(it;it!=a.end()&&m<=1600;it++)//從小到大遍歷元素,中間多了一個判斷m數值的條件  
        {  
			for(int j=0;j<3;j++)  
            {  
                long long tmp=(*it)*ref[j];//使值對應乘一遍2、3、5  
                if(a.find(tmp)==a.end())//find()--返回一個指向被查詢到元素的迭代器,此處為判斷整個set陣列中是否有tmp  
                {  
                    a.insert(tmp);//如果沒有就新增tmp  
                    m++;//醜數+1  
                }  
            }  
        }  
    }  
    m=1;  
    it=a.begin();  
    for(it;it!=a.end()&&m++<1500;it++);//從小到大遍歷set陣列,注意此處的;  
    //一直到m=1499的時候,陣列才停止,此時it++,正好對應了第1500個 
	printf("The 1500'th ugly number is %lld.\n",*it);//nice,完美,沒毛病  
    return 0;  
}