Sin ceros finales
Definir la función
1 |
sinCerosFinales :: Int -> Int |
tal que (sinCerosFinales n) es el número obtenido eliminando los ceros finales de n. Por ejemplo,
1 2 3 4 5 6 |
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,
1 |
sinCerosFinales (sinCerosFinales n) == sinCerosFinales n |
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 |
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 -- La propiedad es prop_sinCerosFinales :: Int -> Bool prop_sinCerosFinales n = sinCerosFinales (sinCerosFinales n) == sinCerosFinales n -- 5ª solución sinCerosFinales5 :: Int -> Int sinCerosFinales5 0 = 0 sinCerosFinales5 n = until (\x -> mod x 10 /= 0) (`div` 10) n -- La comprobación es -- λ> quickCheck prop_sinCerosFinales -- +++ OK, passed 100 tests. |
4 Comentarios