线性筛法求素数
和朴素的筛法求素数不同,线性筛法可以省去许多重复的删除
例如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 }