Este es el segundo problema del Proyecto Euler que empezé a resolver hace uno días. El enunciado dice lo siguiente:
Cada nuevo termino en la secuencia de Fibonacci es generada agregando los dos términos previos. Comenzando con 1 y 2, los primeros 10 términos serán:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
Encuentra la suma de todos los términos pares en una secuencia que no sobrepase los 4 millones.
Entonces, lo primero que tendríamos que hacer, es poder generar la secuencia de Fibonacci hasta que el último término sea menor que 4 millones. A su vez, debemos controlar si cada término generado es par y si lo es, sumarlo.
Pero ¿podemos evitarnos preguntar si cada termino es par? Miren de cerca la secuencia…
Vamos a poner un regla básica que debemos tener presente:
- par+par = par
- par+impar = impar
- impar + par = impar
- impar + impar = par
Si se fijan a partir del numero 3 de la secuencia, siempre se mantiene constante este patrón: impar, impar, par, impar, impar, par. Entonces, deberíamos poder pensar algo para ir de par en par y saltearnos todos los impares que no nos interesan para el resultado final.
Ahora voy a escribir un poco de letras, espero que no se pierdan.
Supongomos que estamos parados sobre un término par de la secuencia, llamemosle C (que por la definición es la suma de sus antecesores, pongamosle A y B). Estonces este término par:
C=A+B
¿Cuál sería el próximo número? Pues la suma de B+C (llamemosle D). ¿Pero C era igual a la suma de A+B? Sí, entonces el próximo número sería:
D= B+C =B + (A+B) = A+2B
¿Y nos animamos a llegar al que sigue? Pongamosle E y por definición sería la suma de C+D. Entonces:
E= C+D = (A+B) + (B+C) = (A+B) + [B+(A+B)] = 2A+3B
Y ese es nuestro próximo número par en la secuencia!
Partiendo dede el 2 y usando estas fórmulas para ir de par en par, se me ocurre hacer algo así:
main()
{
int sum = 0, a, b, c=0;
for(a=1, b=2; c<4000000 ; c=2*a+3*b, a=a+2*b, b=c){
sum += b;
}
printf("%d", sum);
}
Esper no haberlos aburrido ni mareado….ahora les toca a ustedes! 