Suma de los cuadrados de los divisores
Dado un entero positivo n, consideremos la suma de los cuadrados de sus divisores. Por ejemplo,
f(10) = 1 + 4 + 25 + 100 = 130 f(42) = 1 + 4 + 9 + 36 + 49 + 196 + 441 + 1764 = 2500
Decimos que n es especial si f(n) es un cuadrado perfecto. En los ejemplos anteriores, 42 es especial y 10 no lo es.
Definir la función
especial:: Int -> Bool
tal que (especial x) se verifica si x es un número es especial. Por ejemplo,
especial 42 == True especial 10 == False
Calcular todos los números especiales de tres cifras.
Nota: El ejercicio está basado en el Problema 211 del proyecto Euler.
Soluciones
especial :: Int -> Bool especial n = esCuadrado (sum (map (^2) (divisores n))) -- (esCuadrado n) se verifica si n es un cuadrado perfecto. Por ejemplo, -- esCuadrado 36 == True -- esCuadrado 40 == False esCuadrado :: Int -> Bool esCuadrado n = y^2 == n where y = floor (sqrt (fromIntegral n)) -- (divisores n) es la lista de los divisores de n. Por ejemplo, -- divisores 36 == [1,2,3,4,6,9,12,18,36] divisores :: Int -> [Int] divisores n = [x | x <- [1..n], rem n x == 0]