Bonsoir à tous,
Cette année, je suis dispensé d'un cours d'informatique (enfin plutôt une introduction). Étant donné le premier chapitre (55 dias pour nous apprendre à utiliser cout et cin), j'ai décidé de prendre un peu d'avance et de m'attarder sur des exos.
Un des exercices me pose plutôt soucis. Voici l'énoncé :
Calculer les termes de la suite de Fibonacci jusqu’à ce que la différence entre deux valeurs calculées consécutives du nombre d'or soit inférieure à la précision e (la précision étant saisie au clavier)
Voilà ce que j'ai écrit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | //Calculer le nombre d'or à la précision saisie par l'utilisateur //Declaration de variables int e = 0; //Nombre de chiffres significatifs int j = 2; //Variable de boucle double diff = 0.; //Difference entre deux nombres d'or double k = 1.; //Décimale traduisant la précision double t = 0.; //Variable de stockage temporaire double nombreOrRef = 0., nombreOr2 = 0.; // Nombres d'or //Saisie par l'utilisateur std::cout << "Calcul du nombre d'or " << std::endl; std::cout << "Quelle precision souhaitez vous ? "; std::cin >> e; //On récupere le nombre de chiffres significatifs //Calcul de la précision en décimal for (int i = 1; i < e; i++) { k = k/10; //Pour chaque i, on divise par 10. Ex : si notre précision est de 3 -> on divise 3x par 10 } nombreOrRef = fibonacci(2)/fibonacci(1); //On calcule notre premier nombre d'or (entre le premier et le deuxieme terme) do { nombreOr2 = fibonacci(j+1)/fibonacci(j); //Calcul du nombre d'or suivant (j initialisé à 2 auparavant) diff = nombreOr2 - nombreOrRef; //On stocke la différence (entre le précédent et celui calculé) if (diff < 0) //On considère toujours la différence comme positive { diff = - diff; } t = nombreOrRef; nombreOrRef = nombreOr2; // On assigne notre nombre calculé comme référence pour le prochaine j++; //On incrémente pour calculer le nombre d'or suivant }while(diff > k); //Tant que la différence est sup à la précision saisie std::cout.precision(e); std::cout << "Nombre d'or avec precision souhaitee : " << t << std::endl; std::cout << "Nombre d'or avec precision souhaitee : " << nombreOrRef << std::endl; |
Le soucis étant le suivant : 1,6180339887 selon Wikipedia. La machine me donne pour t & nombreOrRef respectivement (entre parenthèse à la main)
1 -> 1 et 2 (1)
2 -> 1,7 et 1,6 (1,6)
3 -> 1,62 et 1,62 (1,62)
4 -> 1,618 et 1,618 (1,618)
5 -> 1,6180 et 1,6181 (1,6180)
6 -> 1,61804 et 1,61803 (1,61803)
7 -> 1,618034 et 1,618034 (1,618034)
8 -> 1,6180341 et 1,6180340 (1,6180340)
9 -> 1,61803399 et 1,61803399 (1,61803399)
10 -> 1,618033988 et 1,618033989 (1,618033989)
Et ainsi de suite. Mes questions sont les suivantes :
-
Aucune des deux listes de variable est 100% correcte. La deuxième semble plus plausible mais les précisions 1 et 5 ne le sont pas (la 1 je comprends encore mais la 5 ?).
-
N'y a-t-il aucune méthode un peu plus élégante? Une piste? Car la j'ai envie de vomir sur mon code
Merci d'avance