素数筛法

来源:互联网 发布:淘宝开什么店比较好 编辑:程序博客网 时间:2024/06/14 20:17

NO.1原始方法:

#include<stdio.h>int n,i,j,a[1000001],p[100000],t=0;void main(){    scanf("%d",&n);//筛选范围是1~n(包括n)     a[1]=0;//1不是素数记为0     for(i=2;i<=n;i++)a[i]=1;// 初始化为1     for(i=2;i<=n;i++)        if(a[i])//从i(i=2)开始,i是素数,就把所有是2的倍数的记为0,结束后i++ {            p[t++]=i;//用数组p记录素数             for(j=i+i;j<=n;j+=i)a[j]=0;        }    for(i=0;i<t;i++)        printf("%d%c",p[i],i<t-1?' ':'/n');//输出结果 }
NO.2//2:优化后的筛法,手动地模拟原始筛法就可以发现,某个数字可能被不止一次地删去  
//   优化后的筛法就可以避免这种不必要的删去操作  

#define Max 1000000  bool prime[Max];  void IsPrime(){       prime[0]=prime[1]=0;prime[2]=1;       for(int i=3;i<max;i++)          prime[i]=i%2==0?0:1;       int t=(int)sqrt(Max*1.0);       for(int i=3;i<=t;i++)         if(prime[i])           for(int j=i*i;j<Max;j+=2*i)//优化               prime[j]=0;  } 
NO.3//素数的二次筛法
//与前两种筛法不同,此种筛法中prime[i]=2*i+3(即:我们只存储奇数,偶数肯定不是素数的)
#define Max 1000000  bool prime[Max>>1];  void IsPrime(){       memset(prime,true,sizeof(prime));       int n=Max>>1,m=(int)(sqrt(Max*1.0)/2.0);       for(int i=0;i<=m;i++)                  if(prime[i])            for(int j=2*i*i+6*i+3;j<=n;j+=2*i+3)              isprime[j]=false;  }  










原创粉丝点击