Desbordamiento de memoria en C

#include <stdlib.h>
#include <stdio.h>
int main (){
   int n, cont, fib, na = 0, nb = 1, sum_even = 0;
   printf ("Insert a number and I'll tell you the respective Fibonacci: ");
   scanf ("%d", &n);
   for (cont = 1; cont < n; cont++) {
      na += nb;
      nb = na - nb;
      fib = na + nb;
      if (fib % 2 == 0) {
         sum_even += fib;
      }
   }
   printf ("%d\n", sum_even);
   return 0;
}

Estaba tratando de hacer el Proyecto Euler problema 2, y luego se me ocurrió este código. El problema es: no puedo encontrar la suma de los pares de números en la secuencia de Fibonacci para números mayores de 400 o algo así, porque la memoria se desborda. En consecuencia, no puedo resolver el ejercicio, ya que pide encontrar la suma de los pares de números por debajo de 4000000 en la secuencia de Fibonacci. ¿Alguien puede ayudarme?

Editar: traté de usar números de tipo flotante para aumentar la capacidad de la respuesta, parece funcionar hasta mil más o menos, pero si intento con números más grandes, obtengo un error -nan en bash después de unos 15 segundos de procesamiento (no realmente no sé lo que significa).

#include <stdlib.h>
#include <stdio.h>
int main () {
   int n, cont, div;
   float sum_even = 0, na = 0, nb = 1, fib;
   printf ("Insert a number and I'll tell you the respective Fibonacci: ");
   scanf ("%d", &n);
   for (cont = 1; cont <= n; cont++) {
      na += nb;
      nb = na - nb;
      fib = na + nb;
      div = fib / 2;
      if (div % 2 == 0) {
         sum_even += fib;
      }
   }
   printf ("%f\n", sum_even);
   return 0;
}

preguntado el 03 de mayo de 12 a las 20:05

2 Respuestas

Lo que observa no es un desbordamiento de memoria, es un desbordamiento numérico. El objetivo del ejercicio era mostrar que el desbordamiento ocurre y hacer que aprendas técnicas para lidiar con él. En este caso particular, esperan que implementes aritmética de enteros de precisión arbitraria, o tome prestada una implementación prefabricada y utilícela con su solución.

contestado el 03 de mayo de 12 a las 20:05

pastebin.com/91YHNJyT Traté de usar números de tipo flotante para aumentar su capacidad, parece funcionar hasta 600 más o menos, pero si pruebo 4000000, después de 15 segundos, obtengo un error -nan en bash. (Realmente no sé lo que significa). - lucas sartori

La idea es usar algo mucho más grande que float, long long, double, o incluso uint128_t. Necesita muchos más dígitos de los que puede caber en 128 bits. Puedes probar CLN, o implemente su propia suma/resta de enteros muy largos codificados, por ejemplo, como matrices de sus dígitos decimales. - Serguéi Kalinichenko

No entendiste bien el enunciado del problema. La tarea es encontrar la suma de

{ fib(n) : fib(n) <= 4000000 && fib(n) % 2 == 0 }

y no

{ fib(n) : n <= 4000000 && fib(n) % 2 == 0 }

Esa tarea se resuelve sin problemas con una modificación menor a su código. En vez de

for (cont = 1; cont < n; cont++) {

utilizado

while(fib <= n) {

contestado el 03 de mayo de 12 a las 20:05

Si. Yo estaba respondiendo lo mismo. Sin embargo, tal vez se necesite un largo en lugar de un int. - aslan986

No es necesario aquí, fib(34) = 5702887 > 4000000, por lo que la suma cabe fácilmente en 32 bits ints. Hay muchos problemas más adelante en los que necesita números enteros de 64 bits. - Daniel Fischer

¡Gracias! Ahora entiendo mi error. De todos modos, voy a echar un vistazo a estos long int, double y esas cosas. Todavía soy muy nuevo en programación, así que no sé mucho. - lucas sartori

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.