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 ‘<number>’
replaced by the number computed. Sample Output The 1500‘th ugly number is <number>.
分析:
第一种方法:遍历每个数,判断是否为ugly,直到第1500个ugly为止(简单粗暴,没有效率可言,runtime 19s)
#include<iostream> #include<algorithm> #include<stdio.h> using namespace std; bool isugly(int n) { while(n>1) { if(n%2==0) n/=2; else if(n%3==0) n/=3; else if(n%5==0) n/=5; else return 0; } return 1; } int main() { int cnt=1; int num=2; while(cnt<1500) { if(isugly(num)) cnt++; num++; } cout<<num-1<<endl; return 0; }
第二种方法:利用STL优先队列从小到大生成各个ugly number。最小的丑数是1,而对于任意丑数x,2x,3x和5x也都是丑数。注意丑数判重。
#include<iostream> #include<algorithm> #include<stdio.h> #include<queue> #include<set> using namespace std; typedef long long LL; int f[3]={2,3,5}; int main() { priority_queue<LL,vector<LL>,greater<LL> > qq; set<LL> s; qq.push(1); s.insert(1); for(int i=1;;i++) { LL x=qq.top(); qq.pop(); if(i==1500) { cout << "The 1500‘th ugly number is " << x << ".\n"; break; } for(int j=0;j<3;j++) { LL x2=x*f[j]; if(!s.count(x2)) { s.insert(x2); qq.push(x2); } } } // cout<<"The 1500‘th ugly number is 859963392."<<endl; return 0; }
原文地址:https://www.cnblogs.com/yinbiao/p/9353942.html
时间: 2024-10-07 07:37:09