Números de Dudeney
La semana pasada, Pepe Muñoz Santonja publicó en su blog Algo más que números el artículo Números de Dudeney en la base OEIS
Un número de Dudeney es un número entero n tal que el cubo de la suma de sus dígitos es igual a n. Por ejemplo, 512 es un número de Dudeney ya que (5+1+2)^3 = 8^3 = 512.
Se puede generalizar variando el exponente: Un número de Dudeney de orden k es un número entero n tal que la potencia k-ésima de la suma de sus dígitos es igual a n. Por ejemplo, 2401 es un número de Dudeney de orden 4 ya que (2+4+0+1)^4 = 7^4 = 2401.
Definir la función
1 |
numerosDudeney :: Integer -> [Integer] |
tal que (numerosDudeney k) es la lista de los números de Dudeney oe orden k. Por ejemplo,
1 2 3 |
take 6 (numerosDudeney 3) == [1,512,4913,5832,17576,19683] take 6 (numerosDudeney 4) == [1,2401,234256,390625,614656,1679616] take 2 (numerosDudeney 20) == [1,1215766545905692880100000000000000000000] |
Comprobar con QuickCheck que 19683 es el mayor número de Dudeney de orden 3.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import Test.QuickCheck numerosDudeney :: Integer -> [Integer] numerosDudeney k = [n^k | n <- [1..] , esDudeney k (n^k)] esDudeney :: Integer -> Integer -> Bool esDudeney k n = (sum (digitos n)) ^ k == n digitos :: Integer -> [Integer] digitos n = [read [d] | d <- show n] -- La propiedad es prop_Dudeney :: Integer -> Property prop_Dudeney n = n > 0 ==> not (esDudeney 3 (19683 + n)) -- La comprobación es -- λ> quickCheck prop_Dudeney -- +++ OK, passed 100 tests. |
6 Comentarios