Menu Close

Día: 28 abril, 2021

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

   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,

   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

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>