Último dígito no nulo del factorial
Enunciado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- El factorial de 7 es -- 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 -- ultimoNoNuloFactorial :: Integer -> Integer -- tal que (ultimoNoNuloFactorial n) es el último dígito no nulo del -- factorial de n. Por ejemplo, -- 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 |
import Test.QuickCheck 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 -- 2ª definición (por comprensión) ultimoNoNulo2 :: Integer -> Integer ultimoNoNulo2 n = read [head (dropWhile (=='0') (reverse (show n)))] -- (factorial n) es el factorial de n. Por ejemplo, -- factorial 7 == 5040 factorial :: Integer -> Integer factorial n = product [1..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. |
4 Comentarios