摘自: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;
}