素数筛法

来源:互联网 发布:软件无线电系统架构 编辑:程序博客网 时间:2024/04/28 20:39
//素数筛法1//非线性#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define MAXN 1000int main(){bool array[MAXN+1];memset(array,true,sizeof(array));array[0]=array[1]=false;for(int i=2;i<=MAXN/2;i++){if(array[i]){for(int j=i+i;j<=MAXN;j+=i){array[j]=false;}}}for(int i=1;i<=MAXN;i++)if(array[i])cout<<i<<'\n';return 0;}

//素数筛法2//线性 每个素数只被删除一次//原理://合理安排删除顺序,使每一个合数只被删除一次//由任何一个合数均能分解为质数的连乘积//例如:16=2^4,9=2*3,12=2^2*3,18=2*9(3^2,此时还未删去,但终究会删去)//把因式分解中最小质数写在最左边,即k=p^m*q (1:p=q,当写成k=p^m,m>=2;2:q是比p大且没有被删过的数)//每个合数写成这种分解是唯一的#include <cstdio>#include <cstring>#include <cmath>#include <iostream>using namespace std;#define MAXN 100int main(){int p,q,k;bool array[MAXN+1];memset(array,true,sizeof(array));array[0]=array[1]=false;for(p=2;p<=sqrt(MAXN);p++){if(array[p]){for(q=p;p*q<=MAXN;q++){if(array[q]){//q的条件很重要,防止重复删除(具体推导可见本子)for(k=p*q;k<=MAXN;k*=p)array[k]=false;}}}}for(int i=1;i<=MAXN;i++)if(array[i])cout<<i<<'\n';return 0;}

//素数筛法3//线性//思想://把合数用它最小的质因子删掉,每个合数被唯一的筛一次//array[0]处的值代表范围内素数个数//且array[1]开始的 array[0]个 数为这些素数#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define MAXN 1000int main(){int array[MAXN+1];memset(array,0,sizeof(array));for(int i=2;i<=MAXN;i++){if(!array[i])            array[++array[0]]=i;for(int j=1;j<=array[0]&&array[j]*i<=MAXN;j++){array[array[j]*i]=1;if(i%array[j]==0)//防止重复删除 推导见本子break;}}cout<<array[0]<<"\n\n";for(int i=1;i<=array[0];i++)cout<<array[i]<<'\n';return 0;}

//素数筛法4//非线性//筛完后array[i]为i的最大素因子#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define MAXN 1000int main(){int array[MAXN+1];memset(array,0,sizeof(array));array[0]=array[1]=1;for(int i=2;i<=MAXN;i++){if(!array[i]){       for(int j=i;j<=MAXN;j+=i)          array[j]=i;    }}for(int i=2;i<=MAXN;i++)cout<<i<<":"<<array[i]<<'\n';return 0;}

1 0
原创粉丝点击