freeCodeCamp/guide/chinese/certifications/javascript-algorithms-and-d.../intermediate-algorithm-scri.../sum-all-primes/index.md

8.0 KiB
Raw Blame History

title localeTitle
Sum All Primes Sum All Primes

:triangular_flag_on_post:如果卡住,请记得使用**Read-Search-Ask** 。尝试配对程序:busts_in_silhouette:并编写自己的代码:pencil:

:checkered_flag:问题说明:

这个问题的解释非常简单。您将生成一个素数列表,最多为您作为参数给出的数字。然后你需要将它们全部添加并返回该值。棘手的部分是生成素数列表。我建议你找一个代码或一个好的数学算法,你可以把它变成代码。

相关链接

:speech_balloon:提示1

生成所有数字的列表,包括您作为参数获得的数字。这将需要确定哪些数字是素数。

现在尝试解决问题

:speech_balloon:提示2

如果您希望找到寻找素数的解决方案,或者尝试学习并实施您自己的Eratosthenes筛请查看此链接

现在尝试解决问题

:speech_balloon:提示3

如果你必须创建自己的代码来检查质数,这个问题很难,所以如果你不得不使用某人的代码,那就不要感到难过。无论哪种方式,你最有可能使用数组,所以一旦你生成了一个素数数组,那么只需将它们全部添加并返回你得到的数字。

现在尝试解决问题

扰流警报!

警告牌

提前解决!

:beginner:基本代码解决方案

function sumPrimes(num) { 
  var res = 0; 
 
  // Function to get the primes up to max in an array 
  function getPrimes(max) { 
    var sieve = []; 
    var i; 
    var j; 
    var primes = []; 
    for (i = 2; i <= max; ++i) { 
      if (!sieve[i]) { 
        // i has not been marked -- it is prime 
        primes.push(i); 
        for (j = i << 1; j <= max; j += i) { 
          sieve[j] = true; 
        } 
      } 
    } 
 
    return primes; 
  } 
 
  // Add the primes 
  var primes = getPrimes(num); 
  for (var p = 0; p < primes.length; p++) { 
    res += primes[p]; 
  } 
 
  return res; 
 } 
 
 // test here 
 sumPrimes(10); 

:rocket: 运行代码

代码说明:

  • 创建一个生成从1到num的数字的函数,并检查它们是否是沿途的素数。
  • 声明将需要的变量。
  • 从2开始如果它没有被标记并添加到筛子阵列那么它是素数并且我们将它添加到素数阵列。
  • 将其他人添加到筛子阵列中。
  • 返回素数
  • 循环返回的数组并添加所有元素然后返回最终值。

相关链接

:sunflower:中级代码解决方案:

function sumPrimes(num) { 
  // function to check if the number presented is prime 
  function isPrime(number){ 
      for (i = 2; i <= number; i++){ 
          if(number % i === 0 && number!= i){ 
          // return true if it is divisible by any number that is not itself. 
             return false; 
          } 
       } 
       // if it passes the for loops conditions it is a prime 
      return true; 
  } 
  // 1 is not a prime, so return nothing, also stops the recursive calls. 
  if (num === 1){ 
    return 0; 
  } 
  // Check if your number is not prime 
  if(isPrime(num) === false){ 
  // for non primes check the next number down from your maximum number, do not add anything to your answer 
    return sumPrimes(num - 1); 
  } 
 
  // Check if your number is prime 
  if(isPrime(num) === true){ 
  // for primes add that number to the next number in the sequence through a recursive call to our sumPrimes function. 
    return num + sumPrimes(num - 1); 
  } 
 } 
 // test here 
 sumPrimes(10); 

:rocket: 运行代码

代码说明:

  • 函数isPrime检查特定数字是否为素数。
  • 如果num为1则返回0因为1不是素数。
  • 如果num不是prime请从最大数字开始检查下一个数字。
  • 如果num是prime则通过递归到sumPrimes函数将其添加到序列中的下一个数字。

相关链接

:rotating_light:高级代码解决方案

function sumPrimes(num) { 
  // step 1 
  let arr = Array.from({length: num+1}, (v, k) => k).slice(2); 
  // step 2 
  let onlyPrimes = arr.filter( (n) => { 
    let m = n-1; 
    while (m > 1 && m >= Math.sqrt(n)) { 
      if ((n % m) === 0) 
        return false; 
        m--; 
    } 
      return true; 
  }); 
  // step 3 
  return onlyPrimes.reduce((a,b) => a+b); 
 } 
 // test here 
 sumPrimes(977); 

:rocket: 运行代码

代码说明:

  • **步骤1**使用Array.from()生成一系列数字,包括num 。与.slice()组合以.slice()前两个索引[0, 1]因为所有素数必须大于1。
  • **步骤2**滤出的所有数字arr是不是素数由每个元件经受的_“试除法测试”“包括由每个整数米大于1且小于或等于n的平方根除以n个“_ 。如果任何小于正在操作的元素m的数字在所述元素n除以它时不产生余数则该测试返回false 。有关详细信息,请参阅下面的链接。
  • **第3步**使用.reduce()返回arr的所有剩余元素的总和。

相关链接

:clipboard:捐款说明:

  • :warning: 请勿添加与任何现有解决方案类似的解决方案。如果您认为它**相似但更好** ,那么尝试合并(或替换)现有的类似解决方案。
  • 添加解决方案的说明。
  • 将解决方案分为以下类别之一 - 基本 中级高级:traffic_light:

看到:point_right: Wiki Challenge Solution Template供参考。