Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Manimecker en 16 Enero 2012, 08:05 am



Título: Serie Fibonacci C++
Publicado por: Manimecker en 16 Enero 2012, 08:05 am
Buenas noches, un saludo muy grande a toda la comunidad de elhacker.net y vengo de nuevo yo con un problema relacionado a la programación.

Tengo el siguiente problema:
Citar
Problema
Escribe un programa que imprima en pantalla todos los números enteros positivos estrictamente menores que N que NO pertenezcan a la serie de Fibonacci.

Entrada
Tu programa deberá de leer del un solo número entero 2<=N<=30000 (30 mil)

Salida
Tu programa deberá imprimir en pantalla todos los números enteros positivos menores que N que no formen parte de la serie de Fibonacci, deberá imprimirlos en orden creciente, separados por espacios.

Ejemplo

Entrada
9
Salida
4 6 7

Básicamente, es un programa que imprima los números menores de N que no pertenezcan a la serie Fibonacci.

Hice el siguiente código:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int num, fb=0, n=0, p=1, i=1;
  6.    scanf("%d", &num);
  7.    while (fb < num) {
  8.        fb=n+p;
  9.        n=p;
  10.        p=fb;
  11.        if (i != p)
  12.            printf("%d ", i);
  13.        i++; }
  14. }

Input:
Citar
9

Output
Citar
4 5 6


Pero simplemente no entiendo por qué no funciona, sé que es un problema de lógica mío, pero no lo veo.

Gracias de antemano y disculpen la molestia.

Debe ser tan fácil, pero no he podido averiguarlo.


Título: Re: Serie Fibonacci C++
Publicado por: rir3760 en 16 Enero 2012, 15:13 pm
Para empezar falta realizar la validación del numero introducido por el usuario.

El programa no funciona correctamente ya que en cada iteracion del bucle calculas el siguiente numero de la serie fibonacci, ello solo debes hacerlo cuando alcances ese numero (al imprimir los números entre este y el anterior).

El programa corregido:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   long num;
  7.   long i;
  8.   long a;
  9.   long b;
  10.   long aux;
  11.  
  12.   scanf("%ld", &num);
  13.  
  14.   a = 3;
  15.   b = 5;
  16.   for (i = 4; i < num; i++)
  17.      if (i != b)
  18.         printf(" %ld", i);
  19.      else {
  20.         aux = a + b;
  21.         a = b;
  22.         b = aux;
  23.      }
  24.   putchar('\n');
  25.  
  26.   return EXIT_SUCCESS;
  27. }

Un saludo


Título: Re: Serie Fibonacci C++
Publicado por: Xandrete en 16 Enero 2012, 20:46 pm
¡Hola! Me gustaría añadir otra solución al problema ^^

Que conste que desde en un principio lo hubiera hecho como rir3760 , pero ya que él lo ha hecho ya así, aporto algo diferente.

Esta solución es más ineficiente en términos de memoria, pero es "más C++".

Código
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main() {
  6. int n,i,j;
  7. cin >> n;
  8. vector<bool> isFib(n);
  9. i = j = 1;
  10. while (j <= n) {
  11. isFib[j-1] = true;
  12. int aux = i;
  13. i = j;
  14. j += aux;
  15. }
  16. for (i = 0; i < n; ++i)
  17. if (not isFib[i]) cout << i + 1 << endl;
  18. }

Y otra, sin vectores:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. int n,i,j;
  6. cin >> n;
  7. i = j = 1;
  8. while (j <= n) {
  9. for (int k = i+1; k < j; ++k)
  10. cout << k << endl;
  11. int aux = i;
  12. i = j;
  13. j += aux;
  14. }
  15. for (int k = i+1; k < n; ++k)
  16. cout << k << endl;
  17. }

Saludos.


Título: Re: Serie Fibonacci C++
Publicado por: Manimecker en 16 Enero 2012, 22:34 pm
Muchas gracias a Xandrete y a rir3760, me dieron una idea con sus códigos de cómo debía ser el código e implemente el siguiente, el cual es muy parecido al de rir3760:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int num, fb, n=1, p=1, i;
  6.    scanf("%d", &num);
  7.    while (num<2 || num>30000)
  8.        scanf("%d", &num);
  9.    for (i=1; i<num; i++) {
  10.        if (i != p)
  11.            printf("%d ", i);
  12.        else {
  13.            fb=n+p;
  14.            n=p;
  15.            p=fb; } }
  16.    return 0;
  17. }
  18.  

Muchas gracias, Xandrete, esta tarde estudiaré tu código ya que me pareció un tanto confuso (sobretodo el primero, por algunas cosas que aún no aprendo).

Muchas gracias a ambos!

Salu2 y suerte.

EDIT---

He mandado mi código a evaluación, y me reporta que en el caso 1 existe un 'Error de ejecución o tiempo de espera agotado' y en los 4 casos restantes la respuesta es correcta.

¿Cuál será el problema?

PD: No tengo los casos que prueban al programa.