Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 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 number computed.
Sample Output
The 1500'th ugly number is .
这道题可以用到set,因为set本身具备一个排序的作用,且可以达到去重的效果,这里主要还是迭代器的运用,迭代器是一种可以连接容器与算法的渠道,相当于一种特别的指针,指向容器中的元素,并代表其元素进入算法当中。
其定义为
容器名<数据类型>::iterator 取名;
例如这道题用到的例子,就是set<long long int>::iterator iter; 就是这样。
常规的用法是:比如用set定义:set<int>a;一般我们会把iter=a.begin();这样把首地址赋予给iter迭代器。此时如果set已经赋予n个元素,这时iter对应第一个元素,如果iter++;或++iter;或--iter,iter--是让iter对应下一个(上一个)元素;++iter后其对应的就是容器当中的第二个元素了。而输出需要一定的格式,如果要输出对应的元素以及运算对应的元素我们要用到的是*iter;
还有一种是iter->l;是指iter指向元素中为l的元素,等效于(*iter).l;
附代码:
#include<cstdio>
#include<set>
#include<algorithm>
#include<iostream>
using namespace std;
set<long long int>s;
int main()
{ int a=0,l[3]={2,3,5};
set<long long int>::iterator iter;
s.insert(1); //现将s赋一个值1
while(a<=10000) //这里是用于扩展set中的元素,a不能过小,因为我们要求第1500个,如果只要1500个数可能得到的比其大,或比其小,因为他是一个个元素挨个乘2.3.5的,可能没有运算要的结果的时候就已经到达1500个数,所以要将a设立的大一点
{ iter=s.begin();
for(iter;a<=10000;++iter)
for(int b=0;b<3;++b)
{
long long int n=(*iter)*l[b]; //因为set本身具有防重的效果,如果加上一个查找排除函数 if(find(s.begin(),s.end(),n)==s.end());然后将未重复的放进容器,这样应该也可以用其他容器来完成。
s.insert(n);
a++;
} }
iter=s.begin();
a=0;
for(int b=1;b<=1499;++b) iter++; //这就是让iter对应第1500个元素了,因为其已经对应了第一个元素,所以只要再加1499次,就可以对应到第1500个元素了;
cout<<"The 1500'th ugly number is "<<*iter<<"."<<endl; }