📅  最后修改于: 2023-12-03 14:51:35.322000             🧑  作者: Mango
埃拉托色尼筛(Sieve of Eratosthenes)是一种古老的筛法,它可以用于查找一定范围内的所有质数。这种算法的名字来自于古希腊数学家埃拉托色尼(Eratosthenes)。
本文将介绍如何用 C 编程语言实现埃拉托色尼筛算法,并给出完整的代码示例。
埃拉托色尼筛的基本思想是:从 2 开始,将每个质数的倍数都标记成合数,直到筛子无法再筛下去为止。具体过程如下:
n+1
的数组 is_prime
,并初始化为 true
。false
。p
,从 p*p
开始,将 p
的倍数标记为合数。#include <stdio.h>
#include <stdbool.h>
void sieve_of_eratosthenes(int n) {
bool is_prime[n+1];
int i, j;
// 初始化数组
for(i = 2; i <= n; i++) {
is_prime[i] = true;
}
// 筛选质数
for(i = 2; i * i <= n; i++) {
if(is_prime[i]) {
for(j = i * i; j <= n; j += i) {
is_prime[j] = false;
}
}
}
// 输出素数
for(i = 2; i <= n; i++) {
if(is_prime[i]) {
printf("%d ", i);
}
}
}
int main() {
int n;
printf("请输入要筛选的素数范围:");
scanf("%d", &n);
printf("素数有:");
sieve_of_eratosthenes(n);
printf("\n");
return 0;
}
#include <stdio.h>
#include <stdbool.h>
这里引入了 stdio.h
标准输入输出函数库和 stdbool.h
定义布尔类型 true
和 false
的函数库。
sieve_of_eratosthenes(int n)
void sieve_of_eratosthenes(int n) {
bool is_prime[n+1];
int i, j;
// 初始化数组
for(i = 2; i <= n; i++) {
is_prime[i] = true;
}
// 筛选质数
for(i = 2; i * i <= n; i++) {
if(is_prime[i]) {
for(j = i * i; j <= n; j += i) {
is_prime[j] = false;
}
}
}
// 输出素数
for(i = 2; i <= n; i++) {
if(is_prime[i]) {
printf("%d ", i);
}
}
}
该函数接收一个整数 n
,代表要筛选的素数范围。函数中使用了一个布尔类型长度为 n+1
的数组 is_prime
,用于记录每个数是否为质数。然后遍历该数组,将所有数初始化为质数。
接下来使用两个嵌套的循环,依次将所有合数标记为 false
。具体实现为:从 2 开始,找到第一个质数 p
,将 p
的所有倍数(除了 p
本身)设置为合数,继续找到下一个未被标记为合数的数,重复以上步骤。
最后再次遍历数组,输出所有素数。
main()
int main() {
int n;
printf("请输入要筛选的素数范围:");
scanf("%d", &n);
printf("素数有:");
sieve_of_eratosthenes(n);
printf("\n");
return 0;
}
主函数中,通过 scanf()
函数获取用户输入的要筛选的素数范围 n
。然后调用 sieve_of_eratosthenes(n)
函数求出素数,并输出结果。
以下是一个使用该程序求出 $1-100$ 范围内所有素数的示例。程序执行结果如下:
请输入要筛选的素数范围:100
素数有:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
本文介绍了如何用 C 编程语言实现埃拉托色尼筛算法,并给出了完整的代码示例。该算法可以高效地求出一定范围内的所有素数,是程序员的一种常用算法。