2017-07-01 4 views
0
#include <stdio.h> 

int fibo(int); 

int main() { 
    int n, p[100]; 

    scanf("%d", &n); 

    int i = 0; 
    do { 
     p[i] = fibo(i); 
     i++; 
    } while (p[i] <= n); 

    printf("%d %d", p[i-1], p[i]); 

    return 0; 
} 

int fibo(int i) { 
    if (i == 0) { 
     return 0; 
    } else 
    if (i == 1) { 
     return 1; 
    } else { 
     return (fibo(i - 1) + fibo(i - 2)); 
    } 
} 

Ceci est le programme que j'ai écrit. J'ai eu une réponse complètement nulle. Quelqu'un peut-il m'aider avec où je vais mal?Un programme en C pour obtenir deux nombres de fibonacci précédents inférieurs au nombre donné

+0

'i ++; } while (p [i] <= n); 'l'index de tableau est déjà incrémenté lorsque vous vérifiez la dernière valeur. (De même pour 'printf ("% d% d ", p [i-1], p [i]); – wildplasser

Répondre

0

Initialiser i = 1, et à l'intérieur du do while loop incrément i premier

int i=-1; 

do 
{ 
    i++; 
    p[i] = fibo(i); 


    } while(p[i] <=n); 


    printf("%d %d", p[i-1], p[i-2]);// print i-1 and i-2 

Le problème a été lors de l'enregistrement p[i]<=n avec le code de la question initiale affichée, vous vérifiez la valeur des déchets car à cette époque, je déjà incrémenté.

2

Vous comparez l'élément de tableau après celui que vous venez calculé. Le tableau n'est pas initialisé, le comportement n'est pas défini.

Vous pouvez corriger votre code de cette façon:

int main() { 
    int n, p[100]; 

    scanf("%d", &n); 

    int i = 0; 
    do { 
     p[i] = fibo(i); 
     i++; 
    } while (p[i-1] <= n); 

    printf("%d %d", p[i-2], p[i-1]); 

    return 0; 
} 

Cependant votre code a plusieurs petits problèmes:

  • Vous ne vérifie pas si scanf() réussi.
  • Vous ne vérifie pas le débordement de tampon potentiel lors de l'enregistrement des valeurs au tableau p.
  • Vous avez un comportement non défini pour les petites valeurs de n que vous allez lire les entrées de p à des décalages négatifs.

Voici une version corrigée qui aborde ces questions:

#include <stdio.h> 

int fibo(int); 

int main(void) { 
    int n, p[100]; 

    if (scanf("%d", &n) == 1) { 
     for (int i = 0; i < 100; i++) { 
      p[i] = fibo(i); 
      if (p[i] > n) 
       break; 
     } 
     if (i >= 2) { 
      printf("%d %d\n", p[i - 2], p[i - 1]); 
     } 
    } 
    return 0; 
} 

int fibo(int i) { 
    if (i == 0) { 
     return 0; 
    } else 
    if (i == 1) { 
     return 1; 
    } else { 
     return (fibo(i - 1) + fibo(i - 2)); 
    } 
} 

Notez cependant que la séquence de Fibonacci diverge rapidement et dépassement arithmétique peut se produire, ce qui provoque un comportement non défini, produisant un résultat incorrect pour les grandes valeurs de n.

Voici une solution simple qui ne pas utiliser la récursivité et n'a pas ce problème:

#include <stdio.h> 

int main(void) { 
    int n, a = 0, b = 1; 

    if (scanf("%d", &n) == 1 && n > 1) { 
     while (a < n - b) { 
      int c = a + b; /* no overflow possible */ 
      a = b; 
      b = c; 
     } 
     printf("%d %d\n", a, b); 
    } 
    return 0; 
}