zoukankan      html  css  js  c++  java
  • [趣题]生成多个质数的幂积序列

    给定三个质数 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; }
  • 相关阅读:
    模板元编程实现素数判定
    JDBC开发
    4.9 当相应行存在时更新
    QT5中如何使用QFtp类(这个类虽然没有被收录,但一直在更新)
    gcc和g++的区别
    Awesome C/C++(图像部分)
    Ubuntu更新源
    GO的GDB调试
    内核探测工具systemtap简介
    列举一下项目中使用的产品和技术
  • 原文地址:https://www.cnblogs.com/marsbible/p/3356409.html
Copyright © 2011-2022 走看看