Sin ceros finales
Definir la función
sinCerosFinales :: Int -> Int
tal que (sinCerosFinales n) es el número obtenido eliminando los ceros finales de n. Por ejemplo,
sinCerosFinales 104050 == 10405 sinCerosFinales 960000 == 96 sinCerosFinales 100050 == 10005 sinCerosFinales (-10050) == -1005 sinCerosFinales 12 == 12 sinCerosFinales 0 == 0
Comprobar con QuickCheck que, para cualquier número entero n,
sinCerosFinales (sinCerosFinales n) == sinCerosFinales n
Soluciones
import Test.QuickCheck -- 1ª solución sinCerosFinales :: Int -> Int sinCerosFinales 0 = 0 sinCerosFinales n | r /= 0 = n | otherwise = sinCerosFinales q where (q,r) = quotRem n 10 -- 2ª solución sinCerosFinales2 :: Int -> Int sinCerosFinales2 0 = 0 sinCerosFinales2 n = read (reverse (dropWhile (=='0') (reverse (show n)))) -- 3ª solución sinCerosFinales3 :: Int -> Int sinCerosFinales3 0 = 0 sinCerosFinales3 n = (read . reverse . dropWhile (== '0') . reverse . show) n -- 4ª solución sinCerosFinales4 :: Int -> Int sinCerosFinales4 0 = 0 sinCerosFinales4 n = read . reverse . dropWhile (== '0') . reverse . show $ n -- 5ª solución sinCerosFinales5 :: Int -> Int sinCerosFinales5 0 = 0 sinCerosFinales5 n = until (\x -> mod x 10 /= 0) (`div` 10) n -- La propiedad es prop_sinCerosFinales :: Int -> Bool prop_sinCerosFinales n = sinCerosFinales (sinCerosFinales n) == sinCerosFinales n -- La comprobación es -- λ> quickCheck prop_sinCerosFinales -- +++ OK, passed 100 tests.