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

8.6 KiB

title localeTitle
Sum All Primes Suma todos los premios

:triangular_flag_on_post: Recuerda usar Read-Search-Ask si te atascas. Tratar de emparejar el programa :busts_in_silhouette: y escribe tu propio código :pencil:

:checkered_flag: Explicación del problema:

La explicación para este problema es muy simple. Generará una lista de números primos hasta el número que se le da como parámetro. Entonces necesitas sumarlos todos y devolver ese valor. La parte difícil está en generar la lista de números primos. Te sugiero que encuentres un código o un buen algoritmo matemático que puedas convertir en código.

Enlaces relevantes

:speech_balloon: Sugerencia: 1

Genere una lista de todos los números hasta e incluyendo el que obtuvo como parámetro. Esto será necesario para determinar qué números son primos o no.

intenta resolver el problema ahora

:speech_balloon: Sugerencia: 2

Marque este enlace si prefiere encontrar una solución para encontrar números primos, o intente aprender e implementar su propio Tamiz de Eratóstenes

intenta resolver el problema ahora

:speech_balloon: Sugerencia: 3

Este problema es difícil si tiene que crear su propio código para verificar los números primos, así que no se sienta mal si tuviera que usar el código de alguien para ese bit. De cualquier manera, lo más probable es que estés usando una matriz, así que una vez que generes una matriz de números primos, simplemente agrégalos todos y devuelve el número que obtienes.

intenta resolver el problema ahora

¡Alerta de spoiler!

señal de advertencia

¡Solución por delante!

:beginner: Solución de código básico:

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: Ejecutar código

Explicación del código:

  • Cree una función que genere los números del 1 al num y verifique si son primos en el camino.
  • Declara las variables que serán necesarias.
  • Comience con 2, si no se ha marcado y agregado a la matriz de tamices, es primo y lo agregamos a la matriz principal.
  • Agregue los otros a la matriz del tamiz.
  • Devuelve los primos
  • Recorra la matriz devuelta y agregue todos los elementos para luego devolver el valor final.

Enlaces relevantes

:sunflower: Solución de código intermedio:

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: Ejecutar código

Explicación del código:

  • La función isPrime verifica si un número particular es primo o no.
  • Si num es 1, devuelve 0 ya que 1 no es un número primo.
  • Si num no es primo, marque el siguiente número hacia abajo desde el número máximo.
  • Si num es primo, agréguelo al siguiente número en la secuencia mediante la recursión a la función sumPrimes .

Enlaces relevantes

:rotating_light: Solución avanzada de código:

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: Ejecutar código

Explicación del código:

  • Paso 1: Use Array.from() para generar una secuencia de números hasta e incluyendo num . Combine con .slice() para cortar los primeros dos índices [0, 1] ya que todos los números primos deben ser mayores que 1.
  • Paso 2: filtre todos los números de arr que no son primos al someter cada elemento a la "prueba de división de prueba" que consiste en dividir n por cada entero m que sea mayor que 1 y menor o igual que la raíz cuadrada de n " . Esta prueba devuelve false si cualquier número menor que el elemento operado en (m) no produce ningún resto cuando dicho elemento (n) está dividido por él. Vea el enlace de abajo para más información sobre esto.
  • Paso 3: Devuelva la suma de todos los elementos restantes de arr usando .reduce() .

Enlaces relevantes

:clipboard: NOTAS PARA LAS CONTRIBUCIONES:

  • :warning: NO agregue soluciones que sean similares a las soluciones existentes. Si cree que es similar pero mejor , intente fusionar (o reemplazar) la solución similar existente.
  • Agregue una explicación de su solución.
  • Categorice la solución en una de las siguientes categorías: Básica , Intermedia y Avanzada . :traffic_light:

Ver :point_right: Wiki Challenge Solution Template para referencia.