素数筛法求素数(线性时间)
摘自:http://blog.csdn.net/once_hnu/article/details/6302283
逆向思维的典型应用!
1)普通方法判断素数:O(n*sqrt(n))
2)筛法求素数:线性时间,即O(n)
// 1:这是最原始的筛法,还有待优化 #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;j<Max;j+=i) prime[j]=0; } //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; }