Último dígito no nulo del factorial
El factorial de 7 es
1 |
7! = 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5040 |
por tanto, el último dígito no nulo del factorial de 7 es 4.
Definir la función
1 |
ultimoNoNuloFactorial :: Integer -> Integer |
tal que (ultimoNoNuloFactorial n) es el último dígito no nulo del factorial de n. Por ejemplo,
1 2 3 4 5 |
ultimoNoNuloFactorial 7 == 4 ultimoNoNuloFactorial 10 == 8 ultimoNoNuloFactorial 12 == 6 ultimoNoNuloFactorial 97 == 2 ultimoNoNuloFactorial 0 == 1 |
Comprobar con QuickCheck que si n es mayor que 4, entonces el último dígito no nulo del factorial de n es par.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import Test.QuickCheck -- 1ª definición -- ============= ultimoNoNuloFactorial :: Integer -> Integer ultimoNoNuloFactorial n = ultimoNoNulo (factorial n) -- (ultimoNoNulo n) es el último dígito no nulo de n. Por ejemplo, -- ultimoNoNulo 5040 == 4 ultimoNoNulo :: Integer -> Integer ultimoNoNulo n | m /= 0 = m | otherwise = ultimoNoNulo (n `div` 10) where m = n `rem` 10 -- (factorial n) es el factorial de n. Por ejemplo, -- factorial 7 == 5040 factorial :: Integer -> Integer factorial n = product [1..n] -- 2ª definición -- ============= ultimoNoNuloFactorial2 :: Integer -> Integer ultimoNoNuloFactorial2 n = ultimoNoNulo2 (factorial n) -- (ultimoNoNulo2 n) es el último dígito no nulo de n. Por ejemplo, -- ultimoNoNulo 5040 == 4 ultimoNoNulo2 :: Integer -> Integer ultimoNoNulo2 n = read [head (dropWhile (=='0') (reverse (show n)))] -- Comprobación -- ============ -- La propiedad es prop_ultimoNoNuloFactorial :: Integer -> Property prop_ultimoNoNuloFactorial n = n > 4 ==> even (ultimoNoNuloFactorial n) -- La comprobación es -- ghci> quickCheck prop_ultimoNoNuloFactorial -- +++ OK, passed 100 tests. |
Pensamiento
Incierto es, lo porvenir. ¿Quién sabe lo que va a pasar? Pero incierto es también lo pretérito. ¿Quién sabe lo que ha pasado? De suerte que ni el porvenir está escrito en ninguna parte, ni el pasado tampoco.
Antonio Machado
Una primera solución bastante literal
Una solución basada en las congruencias e inspirada por el artículo Problema. Hallar el último dígito no nulo de 10000!:
Comprobamos la equivalencia de ambas definiciones, comparamos su eficiencia y definimos la propiedad: