题意不再说,这里给出两个开挂一点的无脑做法
1.
直接输出第1500个丑数
cout << "The 1500'th ugly number is 859963392.";
2.
用集合储存丑数,输出第1500个即可。主要是应用了集合中的元素不会重复的原理,不用考虑如何处理重复丑数。
有一点要注意丑数可能超出int范围变成负数,所以调试几下找出了丑数不溢出且能算出第1500个的次数。
#include <iostream>
#include <cstring>
#include <set>
#include <sstream>
#include <cstdio>
using namespace std;
int main()
{
set<int> dict;
int t=0;
dict.insert(1);
dict.insert(2);
dict.insert(3);
dict.insert(5);
for(set<int>::iterator p=dict.begin();p!=dict.end();p++)
{
dict.insert(*p * 2);
dict.insert(*p * 3);
dict.insert(*p * 5);
t++;
if(t==1300) break;
}
t=0;
cout << "The 1500'th ugly number is ";
for(set<int>::iterator p=dict.begin();p!=dict.end();p++)
{
t++;
if(t==1500)
{
cout << *p;
break;
}
}
cout << "." <<endl;
return 0;
}
PS:萌新初学C++ STL 会的不多,所以用计数器控制循环次数来退出循环。。。。