Factoriales iguales a su número de dígitos
Se dice que un número n tiene un factorial especial si el número de dígitos de n! es igual a n. Por ejemplo, 22 tiene factorial especial porque 22! es 1124000727777607680000 que tiene 22 dígitos.
Definir la función
1 |
factorialesEspeciales :: [Integer] |
tal que su valor es la lista de los números que tienen factoriales especiales. Por ejemplo,
1 |
take 2 factorialesEspeciales == [1,22] |
Nota: Si factorialesEspeciales es una lista finita, argumentar porqué no puede tener más elementos.
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 28 29 30 |
import Data.List (genericLength) factorialesEspeciales :: [Integer] factorialesEspeciales = [n | n <- [1..], tieneFactorialEspecial n] tieneFactorialEspecial :: Integer -> Bool tieneFactorialEspecial n = n == genericLength (show (factorial n)) factorial :: Integer -> Integer factorial n = product [1..n] -- El cálculo es -- ghci> factorialesEspeciales -- [1,22,23,24 C-c C-cInterrupted. -- Para comprobar que no hay más definimos crecimiento :: [(Integer,Integer)] crecimiento = [(n,n - genericLength (show (factorial n))) | n <- [1..]] -- Al evaluarla -- ghci> take 30 crecimiento -- [(1,0),(2,1),(3,2),(4,2),(5,2),(6,3),(7,3),(8,3),(9,3),(10,3),(11,3), -- (12,3),(13,3),(14,3),(15,2),(16,2),(17,2),(18,2),(19,1),(20,1),(21,1), -- (22,0),(23,0),(24,0),(25,-1),(26,-1),(27,-2),(28,-2),(29,-2),(30,-3)] -- se observa que, a partir de n = 25, el número de cifras del factorial -- de n es mayor que n. |