筛法求素数
开一个bool数组,每一位表示对应的下表是否为素数
//素数表 筛法求素数 #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n; bool a[1000000]; int main() { scanf("%d",&n); a[1]=true; for(int i=2;i<=n;i++) for(int j=2;j<i;j++) { if(i%j==0) a[i]=true; } for(int i=1;i<=n;i++) if(a[i]==false) printf("%d ",i); return 0; }
线性筛法求素数
任何合数可以表示成一系列素数的积。
对于每一个合数,我们希望它是被最小的质因子筛掉。
对于当前枚举到的数i,从小到大枚举质数a[j],把i*a[j]筛掉。
如果当前i%a[j]==0,break掉。
#include<iostream> using namespace std; const int n=200000; long prime[n]={0},num_prime=0;//num_pirme记录素数个数 int main() { int m; cin>>m; int a[n]={1,1},i,j; for(i=2;i<m;i++) { if(!a[i]) prime[num_prime++]=i; for(j=0;j<num_prime && i*prime[j]<m;j++) { a[i*prime[j]]=1;//合数标为1,同时,prime[j]是合数i*prime[j]的最小素因子 if(!(i%prime[j]))//即比一个合数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到 break; } } for(i=0;i<num_prime;i++)//输出 { if(i%10==0)printf("\n"); printf("%3d ",prime[i]); } printf("\n"); return 0; }
原文:http://www.cnblogs.com/z360/p/6360991.html