2015 y los números con factorización capicúa
Un número tiene factorización capicúa si puede escribir como un producto de números primos tal que la concatenación de sus dígitos forma un número capicúa. Por ejemplo, el 2015 tiene factorización capicúa ya que 2015 = 13·5·31, los factores son primos y su concatenación es 13531 que es capicúa.
Definir la sucesión
1 |
conFactorizacionesCapicuas :: [Int] |
formada por los números que tienen factorización capicúa. Por ejemplo,
1 2 |
ghci> take 20 conFactorizacionesCapicuas [1,2,3,4,5,7,8,9,11,12,16,18,20,25,27,28,32,36,39,44] |
Usando conFactorizacionesCapicuas escribir expresiones cuyos valores sean las respuestas a las siguientes preguntas y calcularlas
- ¿Qué lugar ocupa el 2015 en la sucesión?
- ¿Cuál fue el anterior año con factorización capicúa?
- ¿Cuál será el siguiente año con factorización capicúa?
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import Data.List (permutations) conFactorizacionesCapicuas :: [Int] conFactorizacionesCapicuas = [n | n <- [1..], not (null (factorizacionesCapicua n))] -- (factorizacionesCapicua n) es la lista de las factorizaciones -- capicúas de n. Por ejemplo, -- factorizacionesCapicua 2015 == [[13,5,31],[31,5,13]] factorizacionesCapicua :: Int -> [[Int]] factorizacionesCapicua n = [xs | xs <- permutations (factorizacion n), esCapicuaConcatenacion xs] -- (factorizacion n) es la lista de todos los factores primos de n; es -- decir, es una lista de números primos cuyo producto es n. Por ejemplo, -- factorizacion 300 == [2,2,3,5,5] factorizacion :: Int -> [Int] factorizacion n | n == 1 = [] | otherwise = x : factorizacion (div n x) where x = menorFactor n -- (menorFactor n) es el menor factor primo de n. Por ejemplo, -- menorFactor 15 == 3 -- menorFactor 16 == 2 -- menorFactor 17 == 17 menorFactor :: Int -> Int menorFactor n = head [x | x <- [2..], rem n x == 0] -- (esCapicuaConcatenacion xs) se verifica si la concatenación de los -- números de xs es capicúa. Por ejemplo, -- esCapicuaConcatenacion [13,5,31] == True -- esCapicuaConcatenacion [135,31] == True -- esCapicuaConcatenacion [135,21] == False esCapicuaConcatenacion :: [Int] -> Bool esCapicuaConcatenacion xs = ys == reverse ys where ys = concat (map show xs) -- El cálculo de la 1ª respuesta es -- ghci> length (takeWhile (<= 2015) conFactorizacionesCapicuas) -- 265 -- El cálculo de la 2ª respuesta es -- ghci> last (takeWhile (<2015) conFactorizacionesCapicuas) -- 2001 -- El cálculo de la 3ª respuesta es -- ghci> head (dropWhile (<=2015) conFactorizacionesCapicuas) -- 2023 |
2 Comentarios