Enunciado
-- 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. |
-- 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
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. |
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.
Se puede imprimir o compartir con
4 soluciones de “Último dígito no nulo del factorial”