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

素数筛两种方法

时间:2016-07-13 19:49:30      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=10005;
bool vis[maxn];
int prime[maxn];
void make_prime()//一般线性筛,会出现重复筛,每一次筛掉的是素数的倍数
{
    memset(vis,true,sizeof(vis));
    vis[0]=vis[1]=false;
    int tot=0;
    for(int i=2;i<maxn;i++)
    {
        if(vis[i])//表明i是素数
        {
            prime[++tot]=i;
            for(int j=i*i;j<maxn;j+=i)//将能够整除这个数的筛掉
                vis[j]=false;
        }
    }
}
void Euler_prime()//快速线性筛法,每一次筛掉的是i*(小于它最小素因子)的合数
{
    memset(vis,true,sizeof(vis));
    int tot=0;
    for(int i=2;i<maxn;i++)
    {
      if(vis[i]) prime[tot++]=i;
      for(int j=0;j<tot&&prime[j]*i<maxn;j++)//不管是不是素数都会进行这一步
      {
          vis[i*prime[j]]=false;
          if(i%prime[j]==0) break;//关键
      }
    }
}
int main()
{
    return 0;
}

素数筛两种方法

标签:

原文地址:http://www.cnblogs.com/xuejianye/p/5667154.html

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