用来产生一个不大于给定整数n的连续质数序列。
数学家认为1既不是质数也不是合数,该算法无法处理这个输入。
基本算法思想就是从第一个质数2开始,把2的所有倍数标记为非素数,然后进入到3,把3的所有倍数标记为非素数,然后跳过4(因为4是2的倍数而且已经被标记为非素数了),然后进入到5,把5的所有倍数标记为非素数,循环直至结束。外层循环只需遍历到根号n即可,因为大于根号n的数要么是素数,要么是有一个小于根号n的因数,这是不可能的,如果有,那么这个数在先前已经被筛选掉。
输入:一个正整数n
输出:包含所有小于等于n的质数的数组
伪代码:
for p<-2 to n do A[p]<-p
for p<-2 to ⌊√n⌋ do
if A[p]≠0
j=p*p
while j<=n do
A[j]=0;
j=j+p
i<-0
for p<-2 to n do
if(A[p]≠0)
L[i]<-A[p]
i<-i+1
return L
C:
#include <stdio.h>
#include <math.h>
int main(){
int n=25;
int A[26];
//int i=0;
int j;
int k=floor(sqrt(n)); //n开方,再向下取整
for(int i=2;i<26;i++) A[i]=i;
for(int p=2;p<=k;p++)
{
if(A[p]!=0) //p没有被前面的步骤消去
{
j=p*p;
while(j<=n)
{
A[j]=0; //消去非质数
j+=p;
}
}
}
for(int p=2;p<=n;p++) //直接输出消去数后的数组
if(A[p]!=0)
printf("%d ",A[p]);
}