线性筛法求素数

和朴素的筛法求素数不同,线性筛法可以省去许多重复的删除

 

例如12:它可以被2,6;3,4筛掉,被筛了2次;

所以新的算法是在处理数i时,枚举i之前的所有质数并用i*质数进行删除,直到第一个质数k能整除i就在这之后停止,因为接下来的所有质数所产生的需要被筛的数num=p*i都可以在后面的枚举到(i/k*p)时被筛掉:(i/k*p)*k(显然可以保证在k之前没有一个数能整除(i/k*p)),所以这样就能保证所有合数只被筛掉了一遍

 1 void init(int k)
 2 {
 3     memset(bl,1,sizeof(bl));
 4     bl[1]=0;
 5     for(int i=2;i<=k;i++)
 6     {
 7         if(bl[i]) prime[++tot]=i;
 8         for(int j=1;j<=tot;j++)
 9         {
10             if(i*prime[j]>k) break;
11             bl[i*prime[j]]=0;
12             if(i%prime[j]==0) break;
13         }
14     }
15 }
View Code

 

posted @ 2019-04-06 10:10  'Clovers'  阅读(341)  评论(0编辑  收藏  举报