/*------------------------------------------------------------------- * Purpose: * * Time: * 2012年3月20日 10:00:39 * Author: * 张彦升 -------------------------------------------------------------------*/ #include <iostream> #include <algorithm> #include <queue> #include <utility> using namespace std; typedef pair<unsigned long,int> node_type; int main() { unsigned long result[1500]; priority_queue<node_type,vector<node_type>,greater<node_type> > Q; Q.push(make_pair(1,2)); for (int i = 0;i < 1500;i++) { node_type node = Q.top(); Q.pop(); switch (node.second) { case 2: Q.push(make_pair(node.first * 2,2)); case 3: Q.push(make_pair(node.first * 3,3)); case 5: Q.push(make_pair(node.first * 5,5)); } result[i] = node.first; } int n; cin >> n; while (n > 0) { cout << result[n - 1] << endl; cin >> n; } return 0; }
在poj的帖子上最后看到了,一个更牛的算法,让我佩服的五体投地
http://poj.org/bbs?problem_id=1338
#include <stdio.h> #include <algorithm> #include <iostream> using namespace std; int main() { int n; int i2_mul; int i3_mul; int i5_mul; long ugly[1501]; i2_mul = 1; i3_mul = 1; i5_mul = 1; ugly[1]=1; int a = 0,b = 0,c = 0; for( int i = 2; i <= 1500; i++ ) { a = ugly[i2_mul]*2; b = ugly[i3_mul]*3; c = ugly[i5_mul]*5; ugly[i] = min(a,min(b,c)); if(ugly[i] == a ) i2_mul++; if(ugly[i] == b ) i3_mul++; if(ugly[i] == c) i5_mul++; } while(true) { scanf("%d",&n); if( n == 0 ) break; printf("%d\n",ugly[n]); } return 0; }
上面算法原理:
对于这个该死的丑数,它只能被2,3,5这三个素数整数,那么它必然存在如下关系式
num = 2^α * 3^β * 5^γ
αβγ分别为将num用2,3,5拆分后2,3,5出现的个数,现在就是对结果进行递推的过程
初始αβγ均为0,按照题意by convention,1 is included,将第一个num设为1