Eratosthense筛法

Posted Alan_Lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eratosthense筛法相关的知识,希望对你有一定的参考价值。

介绍一下Eratosthense筛法(这里是素数表的打法)

对于不超过n的每个非负数P删除2*p,3*p.....,当处理完所有的剩下的就是素数了,
优化方案之一是判重,二是开平方和平方。
首先解释为什么要平方,因为假设i是大于2的,那么i之前的2i,3i,4i什么的都已经被2倍3倍的筛掉了,所以要平方,
再来解释为什么开方就简单了,都i*i做起始了,不开方后边的也是浪费。

#include<stdio.h>
#include<math.h>
#include<string.h>
#define INF 1000000
int vis[1234567];
int  main()
{
    memset(vis,0,sizeof(vis));
    int h=sqrt(INF+0.5);
    for(int i=2;i<=h;i++){
        if(!vis[i]){
            for(int j=i*i;j<=INF;j+=i)
            vis[j]=1;
        }
    }
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        int step=0;
        for(int i=n;i<=m;i++)
        if(!vis[i])
        step++;
        printf("%d\n",step);
    }
}

 我觉得这是一种思想可以用在其他的优化上,引用空间来缩短时间,还有就是开平方和平方的处理 。

以上是关于Eratosthense筛法的主要内容,如果未能解决你的问题,请参考以下文章

代码模板——素数筛法

素数筛法(Eratosthenes筛法)

欧拉筛法模板代码

关于筛法

Eular质数筛法

Eratosthenes筛法 快速求素数