Persistencia multiplicativa de un número
La persistencia multiplicativa de un número es la cantidad de pasos requeridos para reducirlo a una cifra multiplicando sus dígitos. Por ejemplo, la persistencia de 39 es 3 porque 3×9 = 27, 2×7 = 14 y 1×4 = 4.
Definir las funciones
1 2 |
persistencia :: Integer -> Integer menorPersistente :: Integer -> Integer |
tales que
- (persistencia x) es la persistencia de x. Por ejemplo,
1 2 3 4 5 6 |
persistencia 39 == 3 persistencia 2677889 == 8 persistencia 26888999 == 9 persistencia 3778888999 == 10 persistencia 277777788888899 == 11 persistencia 77777733332222222222222222222 == 11 |
- (menorPersistente n) es el menor número con persistencia n. Por ejemplo,
1 2 3 4 5 6 7 8 |
menorPersistente 0 == 1 menorPersistente 1 == 10 menorPersistente 2 == 25 menorPersistente 3 == 39 menorPersistente 4 == 77 menorPersistente 5 == 679 menorPersistente 6 == 6788 menorPersistente 7 == 68889 |
Comprobar con QuickCheck si todos los números menores que 10^233 tienen una persistencia multiplicativa menor o igual que 11.
Nota: Este ejercicio ha sido propuesto por Marcos Giráldez.
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 |
import Test.QuickCheck persistencia :: Integer -> Integer persistencia x | x < 10 = 0 | otherwise = 1 + persistencia (productoDigitos x) productoDigitos :: Integer -> Integer productoDigitos x | x < 10 = x | otherwise = r * productoDigitos y where (y,r) = quotRem x 10 menorPersistente :: Integer -> Integer menorPersistente n = head [x | x <- [1..] , persistencia x == n] -- La propiedad es prop_persistencia :: Integer -> Property prop_persistencia x = x <= y ==> persistencia x <= 11 where y = 10^233 -- La comprobación es -- λ> quickCheck prop_persistencia -- +++ OK, passed 100 tests. |
Referencias
- Persistencia multiplicativa y el número 77777733332222222222222222222 por M. Macho
- Multiplicative persistence por Eric W. Weisstein en MathWorld.
- Sucesión A003001 de la OEIS.