线性筛法求素数

线性筛法求素数

普通的筛法求素数有些数字会被重复筛掉,例如:2*6=12,3*4=12,12就被重复筛。

线性筛法求素数,是为了排除重复的情况

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1181

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXN 1000005
int prime[78600];
bool notprime[MAXN];
int numprime;
void getprime()
{
    int i,j;
    numprime=1;
    memset(prime,0,sizeof(prime));
    memset(notprime,false,sizeof(notprime));
    prime[1]=1;
    notprime[1]=true;
    for(i=2;i<MAXN;i++)
    {
        if(!notprime[i])
        {
            prime[numprime++]=i;
        }
        for(j=1;j<numprime&&i*prime[j]<MAXN;j++)
        {
            notprime[i*prime[j]]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}
int main()
{
    int i;
    int n;
    getprime();
    //printf("%d",numprime);
    scanf("%d",&n);
    for(i=0;i<numprime;i++)
    {
        if(prime[i]>=n&&!notprime[i])
        {
            printf("%d\n",prime[i]);
            break;
        }
    }
    return 0;
}

每一个数字i都与比它小的素数相乘,筛掉非素数;

代码中有关键的一句

 if(i%prime[j]==0)
                break;

如果i%prime[j]=0,那么i=prime[j]*x;这时候如果循环继续下去就是i*prime[j+1],i*prime[j+1]=prime[j]*prime[j+1]*x,那么在之后i=prime[j+1]*x的时候还会再重复筛一遍,所以循环进行到i%prime[j]=0时就应该退出循环。i++继续筛。

posted @ 2016-08-13 13:38  vwqv  阅读(227)  评论(0编辑  收藏  举报