做者自转,原文连接:http://blog.csdn.net/nmlh7448...ios
规定质因子只有2,3,5的数是Ugly Numbers。对于给定的n,输出第n个Ugly Numbers。(n<=1500)数组
能够先求出前1500个Ugly Numbers,而后直接输出便可。所以能够获得全部的Ugly Numbers都是2^a3^b5^c,其中a, b, c>=0.直接枚举a, b, c没有规律,因此能够使用队列的数据结构。首先将1压入队列,而后循环:取队列首元素e,检查e是否出现过,出现过就继续,没有出现过就将 e 储存到一个数组里,将e2,e3,e*5压入队列。这样以后能够高效地选出全部的Ugly Numbers。能够再度加入一个优化,使用优先队列,那么能够保证数字是严格从小到大出现的。数据结构
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<set> using namespace std; long n, v, w; long long u[2000]; struct cmp { bool operator() (long long a, long long b) { return a>b; } }; priority_queue<long long, vector<long long>,cmp> q; bool find(long long k) { for(long i=1; i<=v; i++) if(u[i]==k) return true; return false; } int main() { freopen("in.in", "r", stdin); q.push(1); long long a; w = 1; while(v <= 1500) { a = q.top(); q.pop(); if(!find(a)) { u[++v] = a; q.push(a * 2); q.push(a * 3); q.push(a * 5); } } while(~scanf("%d", &n) && n) cout << u[n] << endl; return 0; }
原本判重是用set实现的,可是效率过低,反而不如暴力的一位数组。优化