Serie Fibonacci C++

Iniciado por Manimecker, 16 Enero 2012, 08:05 AM

0 Miembros y 1 Visitante están viendo este tema.

Manimecker

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:
CitarProblema
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 (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
    int num, fb=0, n=0, p=1, i=1;
    scanf("%d", &num);
    while (fb < num) {
        fb=n+p;
        n=p;
        p=fb;
        if (i != p)
            printf("%d ", i);
        i++; }
}


Input:
Citar9

Output
Citar4 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.

rir3760

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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   long num;
   long i;
   long a;
   long b;
   long aux;
   
   scanf("%ld", &num);
   
   a = 3;
   b = 5;
   for (i = 4; i < num; i++)
      if (i != b)
         printf(" %ld", i);
      else {
         aux = a + b;
         a = b;
         b = aux;
      }
   putchar('\n');
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Xandrete

#2
¡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 (cpp) [Seleccionar]
#include <iostream>
#include <vector>
using namespace std;

int main() {
int n,i,j;
cin >> n;
vector<bool> isFib(n);
i = j = 1;
while (j <= n) {
isFib[j-1] = true;
int aux = i;
i = j;
j += aux;
}
for (i = 0; i < n; ++i)
if (not isFib[i]) cout << i + 1 << endl;
}


Y otra, sin vectores:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main() {
int n,i,j;
cin >> n;
i = j = 1;
while (j <= n) {
for (int k = i+1; k < j; ++k)
cout << k << endl;
int aux = i;
i = j;
j += aux;
}
for (int k = i+1; k < n; ++k)
cout << k << endl;
}


Saludos.

Manimecker

#3
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 (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
    int num, fb, n=1, p=1, i;
    scanf("%d", &num);
    while (num<2 || num>30000)
        scanf("%d", &num);
    for (i=1; i<num; i++) {
        if (i != p)
            printf("%d ", i);
        else {
            fb=n+p;
            n=p;
            p=fb; } }
    return 0;
}


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.