Un número entero x es dígito potencial de orden n si x es la suma de los dígitos de x elevados a n. Por ejemplo,
- 153 es un dígito potencial de orden 3 ya que 153 = 1^3+5^3+3^3
- 4150 es un dígito potencial de orden 5 ya que 4150 = 4^5+1^5+5^5+0^5
Un número x es dígito auto potencial si es un dígito potencial de orden n, donde n es el número de dígitos de n. Por ejemplo, 153 es un número dígito auto potencial.
Definir las funciones
digitosPotencialesOrden :: Integer -> [Integer]
digitosAutoPotenciales :: [Integer] |
digitosPotencialesOrden :: Integer -> [Integer]
digitosAutoPotenciales :: [Integer]
tales que
- (digitosPotencialesOrden n) es la lista de los números dígito potenciales de orden n. Por ejemplo,
take 6 (digitosPotencialesOrden 3) == [0,1,153,370,371,407]
take 5 (digitosPotencialesOrden 4) == [0,1,1634,8208,9474]
take 8 (digitosPotencialesOrden 5) == [0,1,4150,4151,54748,92727,93084,194979]
take 3 (digitosPotencialesOrden 6) == [0,1,548834] |
take 6 (digitosPotencialesOrden 3) == [0,1,153,370,371,407]
take 5 (digitosPotencialesOrden 4) == [0,1,1634,8208,9474]
take 8 (digitosPotencialesOrden 5) == [0,1,4150,4151,54748,92727,93084,194979]
take 3 (digitosPotencialesOrden 6) == [0,1,548834]
- digitosAutoPotenciales es la lista de los números dígito auto potenciales. Por ejemplo,
λ> take 20 digitosAutoPotenciales
[0,1,2,3,4,5,6,7,8,9,153,370,371,407,1634,8208,9474,54748,92727,93084] |
λ> take 20 digitosAutoPotenciales
[0,1,2,3,4,5,6,7,8,9,153,370,371,407,1634,8208,9474,54748,92727,93084]
Soluciones
import Data.List (genericLength)
import Data.Char (digitToInt)
-- 1ª definición de digitosPotencialesOrden
-- ========================================
digitosPotencialesOrden :: Integer -> [Integer]
digitosPotencialesOrden n =
[x | x <- [0..]
, esDigitoPotencialOrden n x]
esDigitoPotencialOrden :: Integer -> Integer -> Bool
esDigitoPotencialOrden n x =
x == sum [y^n | y <- digitos x]
digitos :: Integer -> [Integer]
digitos x = [read [d] | d <- show x]
-- 2ª definición de digitosPotencialesOrden
-- ========================================
digitosPotencialesOrden2 :: Integer -> [Integer]
digitosPotencialesOrden2 n =
filter (esDigitoPotencialOrden2 n) [0..]
esDigitoPotencialOrden2 :: Integer -> Integer -> Bool
esDigitoPotencialOrden2 n x =
x == sum (map (^n) (digitos2 x))
digitos2 :: Integer -> [Integer]
digitos2 = map (toInteger . digitToInt) . show
-- 3ª definición de digitosPotencialesOrden
-- ========================================
-- digitosPotencialesOrden3 3 == [0,1,153,370,371,407]
-- digitosPotencialesOrden3 4 == [0,1,1634,8208,9474]
digitosPotencialesOrden3 :: Integer -> [Integer]
digitosPotencialesOrden3 n =
filter (esDigitoPotencialOrden2 n) [0..10^d-1]
where d = maximoNDigitosPotencialesOrden n
-- (maximoNDigitosPotencialesOrden n) es el máximo número de dígitos de
-- los números dígitos potenciales de orden d. Por ejemplo,
-- maximoNDigitosPotencialesOrden 3 == 5
-- maximoNDigitosPotencialesOrden 5 == 7
maximoNDigitosPotencialesOrden :: Integer -> Integer
maximoNDigitosPotencialesOrden n =
head (dropWhile (\d -> d*9^n >= 10^(d-1)) [1..])
-- 1ª definición de esDigitoAutoPotencial
-- ======================================
esDigitoAutoPotencial :: Integer -> Bool
esDigitoAutoPotencial x =
esDigitoPotencialOrden (genericLength (show x)) x
digitosAutoPotenciales :: [Integer]
digitosAutoPotenciales =
filter esDigitoAutoPotencial [0..]
-- 2ª definición de esDigitoAutoPotencial
-- ======================================
digitosAutoPotenciales2 :: [Integer]
digitosAutoPotenciales2 =
0: concat [[x | x <- [10^k..10^(k+1)-1], esDigitoPotencialOrden (k+1) x]
| k <- [0..]] |
import Data.List (genericLength)
import Data.Char (digitToInt)
-- 1ª definición de digitosPotencialesOrden
-- ========================================
digitosPotencialesOrden :: Integer -> [Integer]
digitosPotencialesOrden n =
[x | x <- [0..]
, esDigitoPotencialOrden n x]
esDigitoPotencialOrden :: Integer -> Integer -> Bool
esDigitoPotencialOrden n x =
x == sum [y^n | y <- digitos x]
digitos :: Integer -> [Integer]
digitos x = [read [d] | d <- show x]
-- 2ª definición de digitosPotencialesOrden
-- ========================================
digitosPotencialesOrden2 :: Integer -> [Integer]
digitosPotencialesOrden2 n =
filter (esDigitoPotencialOrden2 n) [0..]
esDigitoPotencialOrden2 :: Integer -> Integer -> Bool
esDigitoPotencialOrden2 n x =
x == sum (map (^n) (digitos2 x))
digitos2 :: Integer -> [Integer]
digitos2 = map (toInteger . digitToInt) . show
-- 3ª definición de digitosPotencialesOrden
-- ========================================
-- digitosPotencialesOrden3 3 == [0,1,153,370,371,407]
-- digitosPotencialesOrden3 4 == [0,1,1634,8208,9474]
digitosPotencialesOrden3 :: Integer -> [Integer]
digitosPotencialesOrden3 n =
filter (esDigitoPotencialOrden2 n) [0..10^d-1]
where d = maximoNDigitosPotencialesOrden n
-- (maximoNDigitosPotencialesOrden n) es el máximo número de dígitos de
-- los números dígitos potenciales de orden d. Por ejemplo,
-- maximoNDigitosPotencialesOrden 3 == 5
-- maximoNDigitosPotencialesOrden 5 == 7
maximoNDigitosPotencialesOrden :: Integer -> Integer
maximoNDigitosPotencialesOrden n =
head (dropWhile (\d -> d*9^n >= 10^(d-1)) [1..])
-- 1ª definición de esDigitoAutoPotencial
-- ======================================
esDigitoAutoPotencial :: Integer -> Bool
esDigitoAutoPotencial x =
esDigitoPotencialOrden (genericLength (show x)) x
digitosAutoPotenciales :: [Integer]
digitosAutoPotenciales =
filter esDigitoAutoPotencial [0..]
-- 2ª definición de esDigitoAutoPotencial
-- ======================================
digitosAutoPotenciales2 :: [Integer]
digitosAutoPotenciales2 =
0: concat [[x | x <- [10^k..10^(k+1)-1], esDigitoPotencialOrden (k+1) x]
| k <- [0..]]