Números iguales a potencias de las sumas de sus cifras (OME1999 P2)
El enunciado del problema 2 de la OME (Olimpiada Matemática Española) del 1998 es
Hallar todos los números naturales de 4 cifras, escritos en base 10, que sean iguales al cubo de la suma de sus cifras.
Definir la función
1 |
especiales :: Integer -> Integer -> [Integer] |
tal que (especiales a b) es la lista de los números de a cifras que son iguales la suma de sus cifras elevada a b. Por ejemplo,
1 2 |
especiales 5 3 == [17576,19683] especiales 6 4 == [234256,390625,614656] |
Usando la función anterior, calcular las soluciones del problema de la Olimpiada.
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 |
import Data.Char (digitToInt) -- 1ª solución -- =========== especiales :: Integer -> Integer -> [Integer] especiales a b = [n | n <- [10^(a-1)..10^a-1], n == (sumaDigitos n)^b] -- (sumaDigitos n) es la suma de los dígitos de n. Por ejemplo, -- sumaDigitos 2021 == 5 sumaDigitos :: Integer -> Integer sumaDigitos = sum . digitos -- (digitos n) es la lista de los dígitos de n. Por ejemplo, -- digitos 2021 == [2,0,2,1] digitos :: Integer -> [Integer] digitos x = [read [c] | c <- show x] -- Cálculo de la solución del problema de la Olimpiada: -- λ> especiales 4 3 -- [4913,5832] -- 2ª solución -- =========== especiales2 :: Integer -> Integer -> [Integer] especiales2 c e = [z | z <- map (^e) [a..min (9*c) b], z == (f z)^e] where [c', e'] = map fromIntegral [c,e] [a , b ] = [ceiling (10**((c'+p)/e')) | p <- [-1,0]] f = sum . map (toInteger . digitToInt) . show -- Comparación de eficiencia -- ========================= -- La comparación es -- λ> especiales 6 4 -- [234256,390625,614656] -- (7.41 secs, 21,808,919,208 bytes) -- λ> especiales2 6 4 -- [234256,390625,614656] -- (0.01 secs, 168,072 bytes) |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Parece adecuado acotar la base también por debajo (para cuando a es mucho mayor que b).