1、算法介绍
厄拉多塞筛算法(Eratosthenes Sieve)是一种求素数的方法,由古希腊数学家厄拉多塞(Eratosthenes)提出。
2、算法流程
(1)读取输入的整数n,将2至n的所有整数记录在表中;
(2)从2开始,划去表中所有2的倍数;
(3)由小到大寻找表中下一个未被划去的整数,再划去表中所有该整数的倍数;
(4)重复第(3)步,直到找到的整数大于根号n为止;
(5)表中所有未被划去的整数均为素数。
厄拉多塞筛算法流程如下图所示:
3、C语言代码
# include <stdio.h>
# include <math.h>
int flags[10010] = { 0 }; // 0代表质数,1代表合数
int isprime[10010] = { 0 }; // 质数的集合
int i, j;
int num; // [2,N]中质数的个数
void getprimes(unsigned long long N);
int main()
{
unsigned long long N;
printf("请输入N: ");
scanf("%lld", &N);
getprimes(N);
return 0;
}
void getprimes(unsigned long long N)
{
for(i = 2;i < sqrt(N) + 1;i ++)
{
if(flags[i] == 0)
{
j = i * i; //从i的平方开始标记
while(j <= N)
{
//将所有i的倍数(除i本身之外)标记为合数
flags[j] = 1;
j += i;
}
}
}
printf("[2,N]中的全部质数为:\n");
for(i = 2;i <= N;i ++)
{
if(flags[i] == 0) //若i为质数
{
num ++;
printf("%d ", i);
}
}
printf("\n");
printf("共 %lld 个", num);
}
代码说明: 为了代码简单,函数中并没有寻找“下一个”未被划去的整数,而是直接将i自增1,导致了一些没有必要的判断。
4、测试用例
寻找2~150中所有的质数: