Suma de los cuadrados de los divisores
Dado un entero positivo n, consideremos la suma de los cuadrados de sus divisores. Por ejemplo,
1 2 |
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
1 |
especial:: Int -> Bool |
tal que (especial x) se verifica si x es un número es especial. Por ejemplo,
1 2 |
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
[schedule expon=’2017-06-09′ expat=»06:00″]
- Las soluciones se pueden escribir en los comentarios hasta el 09 de junio.
- El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>
[/schedule]
[schedule on=’2017-06-09′ at=»06:00″]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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] |
[/schedule]
8 Comentarios