Sucesiones de números consecutivos con suma dada
El número 15 se puede escribir de 5 formas como suma de números naturales consecutivos:
1 |
15 = 0+1+2+3+4+5 = 1+2+3+4+5 = 4+5+6 = 7+8 = 15. |
Definir las funciones
1 2 |
sucesionesConSuma :: Int -> [(Int,Int)] graficaSucesionesConSuma :: Int -> IO () |
tales que
- (sucesionesConSuma n) es la lista de los pares formados por el primero y por el último elemento de las sucesiones de números naturales consecutivos con suma n. Por ejemplo,
1 2 |
sucesionesConSuma 15 == [(0,5),(1,5),(4,6),(7,8),(15,15)] length (sucesionesConSuma 3000) == 8 |
- (graficaSucesionesConSuma n) dibuja la gráfica del número de formas de escribir los n primeros números como suma de números naturales consecutivos. Por ejemplo, (graficaSucesionesConSuma 100) dibuja
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 |
import Graphics.Gnuplot.Simple -- 1ª solución sucesionesConSuma :: Int -> [(Int,Int)] sucesionesConSuma n = [(x,y) | y <- [0..n], x <- [0..y], sum [x..y] == n] -- 2ª solución sucesionesConSuma2 :: Int -> [(Int,Int)] sucesionesConSuma2 n = [(x,y) | y <- [0..n], x <- [0..y], (x+y)*(y-x+1) == 2*n] -- Comparación de eficiencia -- λ> sucesionesConSuma 700 -- [(3,37),(16,40),(84,91),(97,103),(138,142),(700,700)] -- (2.71 secs, 7,894,718,264 bytes) -- λ> sucesionesConSuma2 700 -- [(3,37),(16,40),(84,91),(97,103),(138,142),(700,700)] -- (0.22 secs, 118,104,176 bytes) -- Gráfica graficaSucesionesConSuma :: Int -> IO () graficaSucesionesConSuma n = plotList [ Key Nothing , PNG "Sucesiones_de_numeros_consecutivos_con_suma_dada.png"] [length (sucesionesConSuma2 k) | k <- [0..n]] |
7 Comentarios