I1M2011: 2º examen de la evaluación continua
En la clase de hoy de Informática de 1º del Grado en Matemáticas se ha realizado el 2º examen de la evaluación continua.
A continuación se muestra el examen junto con su solución:
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
-- Informática (1º del Grado en Matemáticas) -- 2º examen de evaluación continua (30 de noviembre de 2011) -- --------------------------------------------------------------------- -- --------------------------------------------------------------------- -- Ejercicio 1.1. [Problema 357 del Project Euler] Un número natural n -- es especial si para todo divisor d de n, d+n/d es primo. Definir la -- función -- especial :: Integer -> Bool -- tal que (especial x) se verifica si x es especial. Por ejemplo, -- especial 30 == True -- especial 20 == False -- --------------------------------------------------------------------- especial :: Integer -> Bool especial x = and [esPrimo (d + x `div` d) | d <- divisores x] -- (divisores x) es la lista de los divisores de x. Por ejemplo, -- divisores 30 == [1,2,3,5,6,10,15,30] divisores :: Integer -> [Integer] divisores x = [d | d <- [1..x], x `rem` d == 0] -- (esPrimo x) se verifica si x es primo. Por ejemplo, -- esPrimo 7 == True -- esPrimo 8 == False esPrimo :: Integer -> Bool esPrimo x = divisores x == [1,x] -- --------------------------------------------------------------------- -- Ejercicio 1.2. Definir la función -- sumaEspeciales :: Integer -> Integer -- tal que (sumaEspeciales n) es la suma de los números especiales -- menores o iguales que n. Por ejemplo, -- sumaEspeciales 100 == 401 -- --------------------------------------------------------------------- -- Por comprensión sumaEspeciales :: Integer -> Integer sumaEspeciales n = sum [x | x <- [1..n], especial x] -- Por recursión sumaEspecialesR :: Integer -> Integer sumaEspecialesR 0 = 0 sumaEspecialesR n | especial n = n + sumaEspecialesR (n-1) | otherwise = sumaEspecialesR (n-1) -- --------------------------------------------------------------------- -- Ejercicio 2. Definir la función -- refinada :: [Float] -> [Float] -- tal que (refinada xs) es la lista obtenida intercalando entre cada -- dos elementos consecutivos de xs su media aritmética. Por ejemplo, -- refinada [2,7,1,8] == [2.0,4.5,7.0,4.0,1.0,4.5,8.0] -- refinada [2] == [2.0] -- refinada [] == [] -- --------------------------------------------------------------------- refinada :: [Float] -> [Float] refinada (x:y:zs) = x : (x+y)/2 : refinada (y:zs) refinada xs = xs -- --------------------------------------------------------------------- -- Ejercicio 3.1. En este ejercicio vamos a comprobar que la ecuación -- diofántica -- 1/x_1 + 1/x_2 + ... + 1/x_n = 1 -- tiene solución; es decir, que para todo n >= 1 se puede construir una -- lista de números enteros de longitud n tal que la suma de sus -- inversos es 1. Para ello, basta observar que si -- [x_1, x_2, ..., x_n] -- es una solución, entonces -- [2, 2*x_1, 2*x_2, ..., 2*x_n] -- también lo es. Definir la función solucion tal que (solucion n) es la -- solución de longitud n construida mediante el método anterior. Por -- ejemplo, -- solucion 1 == [1] -- solucion 2 == [2,2] -- solucion 3 == [2,4,4] -- solucion 4 == [2,4,8,8] -- solucion 5 == [2,4,8,16,16] -- --------------------------------------------------------------------- solucion 1 = [1] solucion n = 2 : [2*x | x <- solucion (n-1)] -- --------------------------------------------------------------------- -- Ejercicio 3.2. Definir la función esSolucion tal que (esSolucion xs) -- se verifica si la suma de los inversos de xs es 1. Por ejemplo, -- esSolucion [4,2,4] == True -- esSolucion [2,3,4] == False -- esSolucion (solucion 5) == True -- --------------------------------------------------------------------- esSolucion xs = sum [1/x | x <- xs] == 1 |