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