Suma de Divisores - FreeCodeCamp #138 Daily Challenge

2 min

Enunciado: Suma de Divisores

Dado un número entero positivo nn, devuelve la suma de todos sus divisores (enteros que dividen a nn sin dejar resto).

Por ejemplo, para n=6n = 6, los divisores son 1,2,3,61, 2, 3, 6 y la suma es 1212.

Ejemplos:

  • sumOfDivisors(6)1212
  • sumOfDivisors(13)1414
  • sumOfDivisors(28)5656
  • sumOfDivisors(84)224224
  • sumOfDivisors(549)806806
  • sumOfDivisors(9348)2352023520

Análisis y Casos de Prueba

Para resolver el problema, basta con identificar todos los divisores de nn (es decir, todos los ii tales que n%i=0n \% i = 0) y sumarlos. Veamos algunos casos:

nDivisoresSuma
61, 2, 3, 612
131, 1314
281, 2, 4, 7, 14, 2856
841, 2, 3, 4, 6, 7, 12, 14, 21, 28, 42, 84224
5491, 3, 9, 61, 183, 549806
93481, 2, 3, 4, 6, 12, 13, 26, 39, 52, 78, 156, 59, 118, 177, 236, 354, 708, 779, 1558, 2337, 3116, 4674, 934823520

Estos ejemplos cubren casos pequeños, primos, compuestos y un valor grande para validar eficiencia.

Solución y Explicación

Estrategia

Usamos un enfoque directo: iterar de 11 a nn y sumar los valores que dividen a nn exactamente. Es simple, claro y suficiente para los tamaños de entrada del reto.

Diagrama de Flujo

flowchart TD
  A["Entrada: n"] --> B["Inicializar suma = 0"]
  B --> C["Iterar i = 1 a n"]
  C --> D{"n % i == 0?"}
  D -- Sí --> E["suma += i"]
  D -- No --> C
  E --> C
  C --> F["Fin del bucle"]
  F --> G["Devolver suma"]

Código en JavaScript

Código Final

function sumOfDivisors(n) {
  let suma = 0
  for (let i = 1; i <= n; i++) {
    if (n % i === 0)
      suma += i
  }
  return suma
}

Complejidad

  • Tiempo: O(n)O(n) (una iteración por cada número hasta nn).
  • Espacio: O(1)O(1) (solo variables escalares).

Casos Edge y Consideraciones

  • Si n=1n = 1, el único divisor es 11 (la función debe devolver 11).
  • El enunciado asume nn positivo.
  • Para primos, la suma es n+1n + 1.
  • No se consideran negativos ni cero.

Reflexiones y Aprendizajes

  • El operador módulo es clave para identificar divisores.
  • Para nn grandes, se puede optimizar iterando hasta n\sqrt{n} y sumando ambos divisores, logrando O(n)O(\sqrt{n}).
  • La versión actual es didáctica y clara para quienes inician.

Recursos