码迷,mamicode.com
首页 > 其他好文 > 详细

Eratosthense筛法

时间:2016-03-03 20:59:00      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

介绍一下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筛法

标签:

原文地址:http://www.cnblogs.com/VectorLin/p/5239776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!