题目描述
丑数是指不能被2,3,5以外的其他素数整除的数。
然后把丑数从小到大排列起来,前11个数如下:
1,2,3,4,5,6,8,9,10,12,15,...
编写一个程序,计算出第1500个丑数并输出。
输入格式
无
输出格式
输出为一行
计算出的第1500个丑数替换下面句子中的‘<number>’,再输出。
The 1500'th ugly number is <number>.
输入输出样例
输入样例1:
无
输出样例1:
The 1500'th ugly number is <number>.
【耗时限制】1000ms 【内存限制】128MB
这题应该是众所周知了,CSDN上题解也很多,但,我决定用一种非同寻常的写法——set!!!
思路:从1开始,一直分裂每个数的2、3、5倍,这样分出的每个数都满足题目条件,直到分裂出第1500个不重复的数为止(因为分裂是越来越大的,所以找第1500小的)
因为set具有自动排序、自动去重的特性,所以用set可以完美解决分裂数中的重复和第1500小的数
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
set<LL> s;
int main()
{
LL cnt=0;
s.insert(1); //必须先放入1
while(1){ //死循环直到取出第1500个数
LL sum=*s.begin();s.erase(s.begin());cnt++; //取出set中最小的数,别忘了在set中删除
s.insert(sum*2); //放入最小数的2、3、5倍
s.insert(sum*3);
s.insert(sum*5);
if(cnt>=1500){printf("The 1500'th ugly number is %lld.",sum);return 0;}
}
return 0;
}
标签:丑数,set,K11475,insert,sum,样例,1500
From: https://blog.csdn.net/2301_79502610/article/details/141088400