Partage
  • Partager sur Facebook
  • Partager sur Twitter

Suite de Fibonacci

Probleme a partir de l' ordre 50

    14 décembre 2005 à 18:45:01

    Voila j' ai fais un petit prog qui calcul la suite de Fibonacci, voila tout est simple jusqu'a maintenant mais voila a partir de l' ordre 40 je depasse la taille d' un unsigned long .... il n' existe pas un type de variable entiere capable d' aller plus loin ?

    Sinon pour ce qui veulent voir le code

    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[])
    {
        int i = 0;
        int j = 0;
        unsigned long a = 1;
        unsigned long b = 1;
        unsigned long c = 0;

        printf("Jusqu a quelle ordre calcule t on la suite\n");
        scanf("%ld" , &j);

        for( ; i <= j;i++ )
               {
                   c = a + b;
                   printf("Ordre :%ld Suite : %ld \n",i,c);
                   a = b;
                   b = c;
               }


      return 0;
    }
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      14 décembre 2005 à 18:56:24

      J'ai eu ce problème aussi. Tu ne peux pas aller plus loin à moins d'utiliser des double mais tu perdras sûrement de la précision dans les chiffres.

      Autre solution (que j'ai commencé) : programmer une petite bibliothèque qui additionne des ombres plus longs et les stockant dans des char[] (un octet par chiffre).

      ;)
      • Partager sur Facebook
      • Partager sur Twitter
        14 décembre 2005 à 19:09:50

        A oui c'est pas bete ^^

        Mais le blem c'est que je ne sais absolument pas devellopper un biblio, j'ai deja regarder certain envitesse et je n'es pas l'impression que ca suis tout a fais les meme regle
        • Partager sur Facebook
        • Partager sur Twitter
          14 décembre 2005 à 19:54:59

          Je crois que SuperMat developpe une librairie nommée 'GN', par contre je me souviens plus de l'url, demande la lui par MP :)
          • Partager sur Facebook
          • Partager sur Twitter
            14 décembre 2005 à 20:16:49

            J'ai une remarque à faire: je trouve ton for un peu foireux ! Moi j'aurai utilisé un while :

            while( i <= j )
            {

                c = a + b;
                printf("Ordre :%ld Suite : %ld \n",i,c);
                a = b;
                b = c;
                i++;


            }


            Sinon c'es pas mal, ciao !
            • Partager sur Facebook
            • Partager sur Twitter
              14 décembre 2005 à 20:33:23

              Merci Benjitheone j'ai modifier et j' en ai profiter pour ajouter un menu et une nouvelle suite:

              /**
              *Suite
              *
              *Programme de Tws pour apprentissage du C
              *
              */



              #include <stdio.h>
              #include <stdlib.h>

              int main(int argc, char *argv[])
              {
                  void fibonacci(void); //declaration de fibonacci
                  void grelon(void) ; //declaration de grelon

                  int menu =0;

                  printf("=== Menu ===\n\n");
                  printf("1. Suite de Fibonacci\n");
                  printf("2. Suite des grelons \n");

                  printf("\nQuelle operation voulez vous effectuer?: ");
                  scanf("%d", &menu);

                  switch(menu)
                  {

                      case 1:
                          fibonacci();
                          break;
                      case 2:
                          grelon();
                          break;
                       default:
                          break;
                  }


                return 0;
              }

              void fibonacci(void)
                  {

                  int i = 0;
                  int j = 0;
                  unsigned long a = 1;
                  unsigned long b = 1;
                  unsigned long c = 0;

                    printf("\nJusqu'a quelle ordre calcule-t-on la suite\n");
                          scanf("%ld" , &j);

                          while( i <= j )
                              {
                                  c = a + b;
                                  printf("Ordre :%ld suite : %ld \n",i,c);
                                  a = b;
                                  b = c;
                                  i++;
                              }
                  }

              void grelon(void)
                  {
                      long nb =0;
                      long passe = 0;
                      printf("\n\nQuelle nombre voulez vous tester ? : ");
                      scanf("%ld", &nb);

                      while (nb != 1)
                          {
                              passe++;
                              if ((nb%2) == 0 )
                                  {
                                      nb = nb/2;
                                  }
                              else
                                  {
                                      nb = nb*3 +1;
                                  }
                              printf("Passe : %ld nb = %ld\n",passe,nb);
                          }
                      printf("Votre suite finis par 142142 pas de chance");
                  }


              Par contre quelqu'un pourrais m'expliquer la compilation dans des fichiers separes ? Car bon main. c commence a etre un peu charger et j' ai envie d'ameliore le menu pour en faire un a sous-menu pour la suite de fibonacci car de nombreuse autre suite d'ecoule d'elle et il y aura tres peu de chose a changer dans ma fonction

              Merki ^^
              • Partager sur Facebook
              • Partager sur Twitter
                14 décembre 2005 à 20:43:04

                Nanan le for était très bien ; quand on débute on a tendence à mettre du while à toutes les sauces parce que c'est plus simple mais un bon for est plus clair si on met bien toutes les opérations d'incrémentation (qui influent sur la condition) dans la troisième partie du for.
                C'est sûr que si on code comme un sale à fourrer au milieu du corps du for une instruction d'incrémentation, c'est encore plus sale mais bon...

                Par contre ne déclare pas tes fonctions à l'intérieur de main, c'est laid et très peu visible/lisible.

                Pour la compilation séparée, ton main.c est très loin d'être trop chargé.
                • Partager sur Facebook
                • Partager sur Twitter
                  14 décembre 2005 à 21:00:24

                  Pour la compilation séparé, regarde du coté des Makefile.
                  Et ensuite, tu inclus le fichier au bon endroit ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 décembre 2005 à 21:19:18

                    D'ailleurs, pour les "nombreuses autres suites", t'as qu'à recoder ta fonction en plus général, pas besoin de refaire la même fonction à chaque fois.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 décembre 2005 à 21:24:24

                      C' est vrai que c'etait legerement plus comprensible avec le for je l' ai donc remis en place mais dans la fonction "grelon" je croit que while est mieux adapte.

                      Sinon j' ai reussi a faire mon sous menu , et a modifier ma fonction pour quelle puisse s' adapter a n' importe quelle suite de fibonacci


                      voila ce aue je vient de faire (tronquer pour des raison evidente !!! )

                      La declaration des fopnctions de maniere globale

                      #include <stdio.h>
                      #include <stdlib.h>

                      /*declaration des fonctions*/
                      void fibonacci(unsigned long a , unsigned long b); //declaration de fibonacci
                      void grelon(void) ; //declaration de grelon
                      /*Fin de declaration des fonctions*/

                      int main(int argc, char *argv[])
                      ...


                      Mon systeme de sous menu : Est - il interressant de conserver la variable menu ou faut il en cree une autre ?

                      switch(menu)
                          {

                              case 1:
                                  printf("\n\n=== Fibonacci ===\n\n");
                                  printf("1. Suite de Fibonacci Pur\n");
                                  printf("2. Suite de Edouard Lucas\n");
                                  printf("3. Autre suite deriver (vous rentrez les 2 premiers ordres)\n");

                                  printf("\nQuelle operation voulez vous effectuer ? : ");
                                  scanf("%d", &menu);
                                  switch(menu)
                                      {
                                          case 1:
                                               n1 = 1;
                                               n2 = 1;

                                              fibonacci(n1,n2);

                                          break;
                                          case 2:
                                               n1 = 1;
                                               n2 = 3;

                                              fibonacci(n1,n2);

                                          break;
                                          case 3:
                                              printf("\nValeur du premiere ordre : ");
                                              scanf("%ld",&n1);
                                              printf("\nValeur du deusieme ordre : ");
                                              scanf("%ld",&n2);

                                              fibonacci(n1,n2);

                                          break;
                                          default:
                                          break;
                                      }
                              break;


                      J' ai regler dans la fonction les ordres qui ne correspondait pas au valeur calculer , et j' ai mis en place un passage d'argument

                      void fibonacci(unsigned long a , unsigned long b)
                          {

                          int i = 0;
                          int j = 0;
                          unsigned long c = 0;

                            printf("\nJusqu'a quelle ordre calcule-t-on la suite\n");
                                  scanf("%ld" , &j);
                                  printf("Ordre : 1 suite : %ld\n",a);
                                  printf("Ordre : 2 suite : %ld\n",b);
                                  i = i+3;

                                  for( ;i <= j;i++ )
                                      {
                                          c = a + b;
                                          printf("Ordre : %ld suite : %ld \n",i,c);
                                          a = b;
                                          b = c;
                                      }
                          }



                      Sinon pour les bibliotheaue ce sont bien les fichier en .h ? Car j' aimerai bien faire evoluer ma suite pour quelle puisse atteindre n'importe quelle ordre ^^ tension au temps de calcul quand meme !! :D

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        14 décembre 2005 à 22:23:00

                        Petite remarque :
                        Je vois un peu partout des trucs inutilement long.

                        Par exemple, prenons ce bout de code :

                        long int a;
                        long int b = 2;
                        long int c = 3;
                        ...
                        a = b;
                        b = c;

                        Comment le raccourcir?
                        long int a, b = 2, c = 3;
                        ...
                        a = b = c;

                        :)

                        Il existe même une manière d'échanger les valeurs de deux variables en une seule ligne et sans utiliser de variable temporaire :)
                        (càd transformer a = 1 et b = 2 en a = 2 et b = 1) :
                        b = (a+b) - (a = b); :)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Suite de Fibonacci

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown