使用埃拉托斯特尼筛法查找素数 JavaScript


在这个问题陈述中,我们的目标是应用埃拉托斯特尼筛法算法,借助 Javascript 功能找出素数。因此,在我们的程序中,我们将实现一个函数来查找小于给定限制的素数。

理解问题陈述

问题陈述是在 Javascript 中编写一个函数,该函数将用于查找小于给定数字的素数。为了实现此函数,我们将使用埃拉托斯特尼筛法算法。

什么是埃拉托斯特尼筛法算法?

埃拉托斯特尼筛法是一种简单且经典的算法,用于查找小于给定范围的所有素数。此算法通过定义从 2 到给定范围的所有数字的列表,然后迭代地将每个素数的倍数标记为非素数来工作。此过程将持续到所有素数都被识别为止。

此算法是查找素数的有效算法,时间复杂度为 O(n log n)。因此,可以说这种方法比检查每个数字的素性的蛮力技术快得多。

给定问题的实现

为了实现此算法,我们将创建一个大小为 n+1 的布尔数组,其中每个索引代表从 0 到 n 的数字。数组中的所有元素最初都设置为 true。这将表示每个数字都是素数。设置为 false 的前两个元素 0 和 1,因为它们不是素数。

之后,从第一个素数 2 开始,算法将遍历数组,并将所有倍数标记为合数,方法是将其在数组中的值设置为 false。现在,算法将移动到下一个未标记的数字,并重复此过程,直到找到所有素数。

最后,算法将遍历数组并收集值为 true 的所有索引。这表示它们是素数。

算法

步骤 1 − 创建一个函数 generatePrimes 来查找小于 n 个数字的素数。这里 n 是传递给函数的参数。

步骤 2 − 创建一个大小为 n+1 的数组,此数组为布尔类型,并将所有值初始化为 true。

步骤 3 − 遍历从 2 到 n 的平方根的数组。并检查当前数字是否为素数,这意味着值为 true,然后遍历其所有倍数直到 n,并将它们在数组中的值设置为 false。

步骤 4 − 再次遍历从 2 到 n 的数组,并将所有素数添加到结果数组中。

步骤 5 − 返回素数的结果数组,并在屏幕上显示示例用法。

算法代码

function sieveOfEratosthenes(n) {
   // Create a boolean array of size n+1
   let primes = new Array(n + 1).fill(true);
   // Set first two values to false
   primes[0] = false;
   primes[1] = false;
   // Loop through the elements
   for (let i = 2; i <= Math.sqrt(n); i++) {
      if (primes[i]) {
         for (let j = i * i; j <= n; j += i) {
            primes[j] = false;
         }
      }
   }

   let result = [];
   // Loop through the array from 2 to n
   for (let i = 2; i <= n; i++) {
      if (primes[i]) {
         result.push(i);
      }
   }
    
   return result;
}
console.log("All prime numbers up to 20");
console.log(sieveOfEratosthenes(20));

复杂度

创建的函数所花费的时间为 O(n log log n),其中 n 是布尔数组的大小。该算法从 2 迭代到 n 的平方根,并将每个素数的所有倍数标记为合数。循环迭代次数等于 n log log n,因此结果时间复杂度将为 O(n log log n)。因此,此算法对于查找素数非常有效。空间复杂度为 O(n)。

结论

埃拉托斯特尼筛法是一种查找素数的系统方法。它通过查找小于给定限制的所有非素数,并将它们标记为合数来工作。因此,剩余的数字将是素数。此算法对于小型到中型数字特别有效,并且易于在代码中实现。

更新于:2023年5月18日

1K+ 次浏览

开启您的职业生涯

通过完成课程获得认证

开始学习
广告