您的位置:首页 > 其它

素数筛法求素数(线性时间)

2013-09-05 22:22 295 查看
摘自:/article/10592210.html

逆向思维的典型应用!

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: