埃拉托斯特尼筛法

给定一个整数 n,让我们找出所有小于或等于 n 的质数。

示例:

> 输入: n = 10

> 输出: [2, 3, 5, 7]

> 解释: 通过埃拉托斯特尼筛法得到的 10 以内的质数为 [2, 3, 5, 7]。

>

> 输入: n = 35

> 输出: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]

> 解释: 通过埃拉托斯特尼筛法得到的 35 以内的质数为 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]。

目录

  • [朴素方法] – 使用循环 O(n*sqrt(n)) 时间和 O(1) 空间
  • [高效方法] – 埃拉托斯特尼筛法

[朴素方法] – 使用循环 O(n*sqrt(n)) 时间和 O(1) 空间

> 查找从 INLINECODE212a3787 到 INLINECODEb1cc724f 的所有质数的朴素方法,包括单独检查每个数字以确定它是否为质数

逐步实现:

  • 遍历从 INLINECODEfe8f54b3 到 INLINECODE67288fab 的所有数字 i
  • 对于每个 INLINECODEd26951b5,检查它是否可以被 INLINECODEe2d39f1d 到 i - 1 之间的任何数字整除。
  • 如果它可以被整除,则 i 不是质数。
  • 如果它不能被该范围内的任何数字整除,则 i 是质数。

> 埃拉托斯特尼筛法通过从 2 开始,反复将每个质数的倍数标记为非质数,从而高效地找到所有直到 n 的质数。这避免了冗余检查,并快速过滤掉所有合数。

逐步实现:

  • 初始化一个布尔数组 pINLINECODE27b4f81a,并将所有条目设置为 INLINECODE8eaf846e,但 INLINECODEd5f00f2c 和 INLINECODE711817e5 除外(它们不是质数)。
  • 从 2 开始,这是最小的质数。
  • 对于从 INLINECODE03e97baf 到 INLINECODE75ba0df7 的每个数字 p
  • 如果 p 被标记为质数:
  • 将 INLINECODE2ed5b41a 的所有倍数标记为非质数,从 INLINECODEe7e6e86b 开始(因为更小的倍数已经被更小的质数标记过了)。
  • 循环结束后,pINLINECODE5aaee81d 数组中所有剩余为 INLINECODE53c87c52 的条目即代表质数。

C++


CODEBLOCK_0a890fbc

Java


CODEBLOCK_63db0e33

Python


CODEBLOCK_83b4ac41

C#


using System;

using System.Collections.Generic;

class GfG {

// Function to return all prime numbers up to n

static List sieve(int n) {

// Boolean array to mark primes

bool[] prime = new bool[n + 1];

for (int i = 0; i <= n; i++) {

prime[i] = true;

}

// Sieve of Eratosthenes

for (int p = 2; p * p <= n; p++)

{

if (prime[p])

{

f

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/21157.html
点赞
0.00 平均评分 (0% 分数) - 0