📜  埃拉托色尼筛 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:51:35.322000             🧑  作者: Mango

埃拉托色尼筛 - C 编程语言

埃拉托色尼筛(Sieve of Eratosthenes)是一种古老的筛法,它可以用于查找一定范围内的所有质数。这种算法的名字来自于古希腊数学家埃拉托色尼(Eratosthenes)。

本文将介绍如何用 C 编程语言实现埃拉托色尼筛算法,并给出完整的代码示例。

算法原理

埃拉托色尼筛的基本思想是:从 2 开始,将每个质数的倍数都标记成合数,直到筛子无法再筛下去为止。具体过程如下:

  1. 创建一个长度为 n+1 的数组 is_prime,并初始化为 true
  2. 从 2 开始,将数组中的所有合数标记为 false
  3. 对于每个质数 p,从 p*p 开始,将 p 的倍数标记为合数。
  4. 得到所有未被标记为合数的数组下标,即为素数。
代码实现
#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 定义布尔类型 truefalse 的函数库。

筛选质数函数 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 编程语言实现埃拉托色尼筛算法,并给出了完整的代码示例。该算法可以高效地求出一定范围内的所有素数,是程序员的一种常用算法。