Autor
|
Tema: [?] Error en secuencia de Fibonacci. (Leído 7,462 veces)
|
LlaboneTM
Desconectado
Mensajes: 9
Ego sum Qui sum
|
Saludos, Andaba haciendo ejercicios de programacion C y se cruzo el conocido ejercicio de imprimir la serie de Fibonacci. Ahora, el problema es el siguiente: Luego de haber resuelto el ejercicio, resulta que anda sin problemas hasta el numero 47 de la serie, a partir de ahi entran numeros negativos. Ya intente otros modelos para realizar el mismo programa, incluso use predefinidos por otros, y sucede lo mismo, intenté usando unsigned long, tampoco lo corrige ¿que falla? (uso Dev-c++) El programa:#include<stdio.h> #include<conio.h> main() { int n,s,A=0,B=1; printf("\n\nFIBONACCI SEQUENCE\n\n"); printf("Insert number:\n"); scanf("%d", &n); while(n<=0) { printf("\nERROR\n\n"); getch(); printf("Insert number:\n"); scanf("%d", &n); } printf("\n\nFIBONACCI SEQUENCE\n\n"); for(s=1;s<=n;s++) { printf("%d ", A); A+=B; B=A-B; } getch(); return 0; }
El error:Espero sus respuestas.
|
|
« Última modificación: 25 Mayo 2013, 22:42 pm por LlaboneTM »
|
En línea
|
|
|
|
Khronos14
Desconectado
Mensajes: 443
A lie is a lie
|
El fallo es que a partir del número 47 los números son muy grandes y no se pueden representar con 4 bytes. Puedes probar con unsigned long long que son 8 bytes, pero llegará un momento en el que vuelvas a tener el mismo problema.
Puedes buscar librerías matemáticas para C que te permitan trabajar con números más grandes, van a ser lentas, pero te darán esa opción.
Saludos.
|
|
|
En línea
|
|
|
|
LlaboneTM
Desconectado
Mensajes: 9
Ego sum Qui sum
|
Vale, gracias por la resuesta, con unsigned long queda varado en el mismo lugar; pero si, otra opcion son esas librerias, voy a intentar por ese lado.
|
|
« Última modificación: 25 Mayo 2013, 22:54 pm por LlaboneTM »
|
En línea
|
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
No sé cual es el problema pero es algo raro. En C da ese error, en cambio en c++ no #include <iostream> using namespace std; main() { unsigned long int n,s,A=0,B=1; cout << endl << endl << "FIBONACCI SEQUENCE" << endl << endl ; cout <<"Insert number:" << endl; cin >> n; while(n<=0) { cout << endl << endl << "ERROR" << endl << endl; getchar(); } cout << endl << endl << "FIBONACCI SEQUENCE" << endl << endl; for(s=1;s<=n;s++) { cout <<" " << A; A+=B; B=A-B; } getchar(); getchar(); return 0; }
Voy a seguir mirando el código en C remplazando los trozos de source a C++ para saber que elemento da el problema. Un saludo.
|
|
|
En línea
|
I like to test things.
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
El problema es simplemente que en algún momento el número se sale de rango, si quieres hallar numeros de Fibonacci de una forma prácticamente ilimitada, tienes un par de opciones: 1) Crearte una clase para trabajar con números muy grandes, sobrecargando operadores para realizar las operaciones aritméticas (esto si que es un ejercicio de programación). 2) Usar una librería para este fin, como GMPSaludos.
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
No sé solucionar el error, seguramente alguien con más experiencia en C te pueda ayudar. /*El problema esta en el:*/ printf("%d ", A); /*Lo cambio por el:*/ cout <<" " << A; /*y no da problemas*/
Si te vale en C++ el código sería el que te puse o podrías añadirle solo lo mínimo en C++ (por algo programarás en C jeje) quedando así : #include<iostream> #include<stdio.h> #include<conio.h> main() { unsigned long int n,s,A=0,B=1; printf("\n\nFIBONACCI SEQUENCE\n\n"); printf("Insert number:\n"); scanf("%d", &n); while(n<=0) { printf("\nERROR\n\n"); getch(); printf("Insert number:\n"); scanf("%d", &n); } printf("\n\nFIBONACCI SEQUENCE\n\n"); for(s=1;s<=n;s++) { std::cout <<" " << A; A+=B; B=A-B; } getch(); return 0; }
Los cambios que hice fueron: Cambié el trozo que ya te comenté(linea 27), incluí la librería de entrada/salida(linea 1) y declaré las locales como unsigned long int.(linea 7) El problema es simplemente que en algún momento el número se sale de rango, si quieres hallar numeros de Fibonacci de una forma prácticamente ilimitada, tienes un par de opciones: 1) Crearte una clase para trabajar con números muy grandes, sobrecargando operadores para realizar las operaciones aritméticas (esto si que es un ejercicio de programación). 2) Usar una librería para este fin, como GMPSaludos. ¿Y porque con el mismo source en C++ funciona y en C no? Saludos.
|
|
|
En línea
|
I like to test things.
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
El fallo es que a partir del número 47 los números son muy grandes y no se pueden representar con 4 bytes. Puedes probar con unsigned long long que son 8 bytes, pero llegará un momento en el que vuelvas a tener el mismo problema. Puedes buscar librerías matemáticas para C que te permitan trabajar con números más grandes, van a ser lentas, pero te darán esa opción. No,no tienen que ser necesariamente lentas. C incorpora una librería básica para manejar números algo más grandes de lo habitual: #include <inttypes.h>.
Una salida para la que tu planteabas de 70 es:Dame un numero :70 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 43349443 7 701408733 1134903170 1836311903 2971215073 48075269 76 7778742049 12586269025 20365011074 32951280099 53316291 173 86267571272 139583862445 225851433717 365435296162 59128672 9879 956722026041 1548008755920 2504730781961 4052739537881 65574703 19842 10610209857723 17167680177565 27777890035288 44945570212853 72723460 248141 117669030460994 190392490709135Que si no he revisado mal se corresponde con el resultado más poderoso del programa Mathmatica:{1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135} Pero sí, el tema de los números grandes es una pena que no venga implementado en el propio C. Pero menos es nada, con lo anterior ya tienes valores bastantes más altos.
Saluditos!. ... ..
|
|
« Última modificación: 26 Mayo 2013, 15:35 pm por leosansan »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Con la emoción de los resultados obtenidos me olvidé poner el código , ahí va:#include <stdio.h> #include <inttypes.h> int main() { uint64_t n,a,b,c,aux; do { printf("\nDame un numero :"); scanf("%llu",&n); puts(""); } while(n<=0); a=1;b=0; for(c=1;c<=n;c++) { printf("%llu\t",a); aux=a; a+=b; b=aux; } return 0; }
Saluditos!. .... ..
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Secuencia fibonacci
Java
|
Erik#
|
7
|
16,981
|
1 Octubre 2008, 18:04 pm
por Sk9ITk5Z
|
|
|
Sucesión Fibonacci [Batch]
« 1 2 »
Scripting
|
leogtz
|
17
|
15,321
|
15 Junio 2009, 17:26 pm
por leogtz
|
|
|
FIBONACCI
« 1 2 »
Programación C/C++
|
JOSE23
|
12
|
16,463
|
24 Febrero 2011, 00:09 am
por RyogiShiki
|
|
|
Serie Fibonacci C++
Programación C/C++
|
Manimecker
|
3
|
22,625
|
16 Enero 2012, 22:34 pm
por Manimecker
|
|
|
jasperReport error: Byte no válido 1 de la secuencia UTF-8 de 1 bytes
Java
|
mgc
|
0
|
5,249
|
14 Noviembre 2014, 13:47 pm
por mgc
|
|