Menu Close

Último dígito no nulo del factorial

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.

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.
Medio

4 soluciones de “Último dígito no nulo del factorial

  1. Tamara Royán González
    ultimoNoNuloFactorial :: Integer -> Integer
    ultimoNoNuloFactorial n = last (filter (/=0) (digitosC (factorial n))) 
     
    factorial :: Integer -> Integer
    factorial n = product [1..n]
     
    digitosC :: Integer -> [Integer]
    digitosC n = [read [x] | x <- show n]
  2. Jesús Navas Orozco
    ultimoNoNuloFactorial :: Integer -> Integer
    ultimoNoNuloFactorial n = 
       head [read [x]| x<- (reverse (show (factorial n))), x /= '0']
     
    factorial :: Integer -> Integer
    factorial n = product [1..n]
  3. Jesús Navas Orozco
    ultimoNoNuloFactorial :: Integer -> Integer
    ultimoNoNuloFactorial n = read [head (dropWhile (== '0') (reverse (show (factorial n))))]
     
    prop :: Integer-> Property
    prop n = n> 4 ==> even (ultimoNoNuloFactorial n)
     
    -- La comprobación es: 
    --    *Main> quickCheck prop
    --    +++ OK, passed 100 tests.
  4. Rafa
    ultimoNoNuloFactorial :: Integer -> Integer
    ultimoNoNuloFactorial x = last (filter (/=0) (digitos (factorial x)))
     
    digitos :: Integer -> [Integer]
    digitos n = [read [x] | x <- show n]
     
    factorial :: Integer -> Integer
    factorial n = product [1..n]
     
    prop :: Integer -> Bool
    prop x = x < 4 || even (ultimoNoNuloFactorial x)

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.