Año cúbico
El año 2016 será un año cúbico porque se puede escribir como la suma de los cubos de 7 números consecutivos; en efecto,
1 |
2016 = 3³+ 4³ +...+ 9³ |
Definir la función
1 |
esCubico :: Integer -> Bool |
tal que (esCubico x) se verifica si x se puede escribir como la suma de los cubos de 7 números consecutivos. Por ejemplo,
1 2 3 4 |
esCubico 2016 == True esCubico 2017 == False esCubico 189005670081900441 == True esCubico 189005670081900442 == False |
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 |
-- 1ª definición -- ============= esCubico1 :: Integer -> Bool esCubico1 x = pertenece x cubicos -- cubicos es la lista de los números que se pueden escribir como la -- suma de los cubos de 7 números consecutivos. Por ejemplo, -- take 5 cubicos == [784,1295,2016,2989,4256] cubicos :: [Integer] cubicos = [sum [x^3 | x <- [y..y+6]] | y <- [1..]] -- (pertenece x ys) se verifica si x pertenece a la lista ordenada -- ys. Por ejemplo, -- pertenece 25 [0,3..] == False -- pertenece 27 [0,3..] == True pertenece :: Integer -> [Integer] -> Bool pertenece x ys = x == head (dropWhile (<x) ys) -- 2ª definición -- ============= esCubico2 :: Integer -> Bool esCubico2 x = pertenece x (cubicosDesde k) where k = floor ((fromIntegral x/7)**(1/3)) cubicosDesde :: Integer -> [Integer] cubicosDesde k = [sum [x^3 | x <- [y..y+6]] | y <- [k..]] -- Comparación de eficiencia -- ========================= -- λ> esCubico1 189005670081900441 -- True -- (7.49 secs, 1,917,868,024 bytes) -- λ> esCubico2 189005670081900441 -- True -- (0.01 secs, 0 bytes) |
2 Comentarios