Menor número triangular con más de n divisores
La sucesión de los números triangulares se obtiene sumando los números naturales.
1 2 3 4 5 6 |
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 3 6 10 15 |
Así, el 7º número triangular es
1 |
1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. |
Los primeros 10 números triangulares son
1 |
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... |
Los divisores de los primeros 7 números triangulares son:
1 2 3 4 5 6 7 |
1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 |
Como se puede observar, 28 es el menor número triangular con más de 5 divisores.
Definir la función
1 |
menorTriangularConAlMenosNDivisores :: Int -> Integer |
tal que (menorTriangularConAlMenosNDivisores n) es el menor número triangular que tiene al menos n divisores. Por ejemplo,
1 2 3 |
menorTriangularConAlMenosNDivisores 5 == 28 menorTriangularConAlMenosNDivisores 50 == 25200 menorTriangularConAlMenosNDivisores 500 == 76576500 |
Nota: Este ejercicio está basado en el problema 12 del Proyecto Euler
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import Data.List (group) import Data.Numbers.Primes (primeFactors) menorTriangularConAlMenosNDivisores :: Int -> Integer menorTriangularConAlMenosNDivisores n = head [x | x <- triangulares, nDivisores x >= n] -- Nota: Se usarán las funciones -- + triangulares definida en [Números triangulares](http://bit.ly/2rtr6a3) y -- + nDivisores definida en [Número de divisores](http://bit.ly/2DgVh74) -- triangulares es la sucesión de los números triangulares. Por ejemplo, -- take 10 triangulares == [1,3,6,10,15,21,28,36,45,55] triangulares :: [Integer] triangulares = scanl1 (+) [1..] -- (nDivisores x) es el número de divisores de x. Por ejemplo, -- nDivisores 28 == 6 nDivisores :: Integer -> Int nDivisores = product . map ((+1) . length) . group . primeFactors |
Pensamiento
«La Matemática es una ciencia experimental y la computación es el experimento.» ~ Rivin
En Python