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);
    }
}

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

posted @ 2016-03-03 19:19  Alan2  阅读(342)  评论(0编辑  收藏  举报