Los números de Armstrong
Un número de n dígitos es un número de Armstrong si es igual a la suma de las n-ésimas potencias de sus dígitos. Por ejemplo, 371, 8208 y 4210818 son números de Armstrong ya que
1 2 3 |
371 = 3^3 + 7 + 1³ y 8208 = 8^4 + 2^4 + 0^4 + 8^4 4210818 = 4^7 + 2^7 + 1^7 + 0^7 + 8^7 + 1^7 + 8^7 |
Definir las funciones
1 2 |
esArmstrong :: Integer -> Bool armstrong :: [Integer] |
tales que
- (esArmstrong x) se verifica si x es un número de Armstrong. Por ejemplo,
1 2 3 4 5 6 |
esArmstrong 371 == True esArmstrong 8208 == True esArmstrong 4210818 == True esArmstrong 2015 == False esArmstrong 115132219018763992565095597973971522401 == True esArmstrong 115132219018763992565095597973971522402 == False |
- armstrong es la lista cuyos elementos son los números de Armstrong. Por ejemplo,
1 2 |
λ> take 18 armstrong [1,2,3,4,5,6,7,8,9,153,370,371,407,1634,8208,9474,54748,92727] |
Comprobar con QuickCheck que los números mayores que
115132219018763992565095597973971522401 no son números de Armstrong.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import Test.QuickCheck esArmstrong :: Integer -> Bool esArmstrong x = x == sum [d^n | d <- digitos x] where n = length (show x) -- (digitos x) es la lista de los dígitos de x. Por ejemplo, -- digitos 325 == [3,2,5] digitos :: Integer -> [Integer] digitos x = [read [d] | d <- show x] armstrong :: [Integer] armstrong = [n | n <- [1..], esArmstrong n] -- La propiedad es prop_Armstrong :: Integer -> Bool prop_Armstrong n = not (esArmstrong (115132219018763992565095597973971522401 + abs n + 1)) -- La comprobación es -- λ> quickCheck prop_Armstrong -- +++ OK, passed 100 tests. |
4 Comentarios