[趣题]生成多个质数的幂积序列

给定三个质数 3,5,7,需要得到从小到大排列的前k个合数,只能包含这三个质因子。比如k=4,那么结果是1,3,5,7

初看上去感觉有点乱,貌似没有办法简单的根据第k-1个数计算第k个数,但是很显然的是,第k个数只能是用前k-1个数中的某个数乘以3或者5或者7得到。

这样,我们可以认为存在3个子序列,分别对当前序列的元素乘以3或5或7,后续元素是这三个子序列归并得到,每个子序列有一个索引标示当前需要操作的元素,

序列里的下一个元素总是选择这三个子序列的当前元素中最小的值,选中之后,子序列当前元素后移一个。然后重复此操作,就可以得到K个元素,算法复杂度O(n)。

 

#include <iostream>
#include <stdlib.h>

using namespace std;

#define
min(X,Y) ((X) < (Y) ? (X) : (Y)) inline void gen_prime(int& idx_3, int& idx_5, int& idx_7,long long *buf, int& out_size) { long long t3,t5,t7; long long mmin; t3 = buf[idx_3]*3; t5 = buf[idx_5]*5; t7 = buf[idx_7]*7; mmin = min(min(t3,t5), t7); if(mmin == t3) idx_3++; if(mmin == t5) idx_5++; if(mmin == t7) idx_7++; buf[out_size++] = mmin; } #define MAX_NUNBER 1024 int main(int argc, char *argv[]) { int k; int i3=0,i5=0,i7=0; int outsize = 1; long long buf[MAX_NUNBER]; buf[0] = 1; k = atoi(argv[1]); if(k > MAX_NUNBER ) k = MAX_NUNBER ; if(k < 0) k = 4; do { gen_prime(i3,i5,i7,buf,outsize); }while(outsize < k); for(int i=0; i < k; i++) cout<<buf[i]<<endl; return 0; }

 

posted on 2013-10-08 00:19  macrosoft  阅读(472)  评论(0编辑  收藏  举报

导航