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

线性筛法求素数

时间:2016-08-13 14:12:41      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

线性筛法求素数

普通的筛法求素数有些数字会被重复筛掉,例如: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++继续筛。

线性筛法求素数

标签:

原文地址:http://www.cnblogs.com/vwqv/p/5767868.html

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