Factorielle en langage C (avec boucle)

Fermé
Bonjour,

Je dois développer un programme qui calculera la factorielle :
- au moyen d'une boucle (while ou for),
- par appel récursif d'une fonction (n! = n x (n-1)!)
L'utilisateur entrera l'entier, le programme retournera le résuktat formaté à l'écran.

Nous n'avons pas encore vu les boucles en cours, alors est-ce que quelqu'un pourrait m'aider à écrire ces programmes ?

Dans la suite, on nous demande d'explorer le rôle que joue le choix de travailler avec des entiers longs (long int), courts (short int) ou normaux : quelle est la valeur maximale de n possible dans chaque cas. Utilisez l'utilitaire C sizeof() pour déterminer la dimension en octets des chiffres ainsi déclarés.

Nous n'avons pas encore vu les entiers longs et courts et sizeof() non plus, est-ce que quelqu'un pourrait m'expliquer ce qu'il s'agit de faire ?

Ensuite, on nous demande de faire le même calcul en travaillant avec la multiplication de nombres réels (float) et double précision (double). Y-a-t-il une amélioration de vos résultats en comparaison avec le calcul fait avec des entiers ? Quel est le plus grand entier N que l'on peut traiter dans chaque cas ?

Nous n'avons pas encore vu la double précision, est-ce que quelqu'un pourrait m'expliquer ce qu'il s'agit de faire ?

Merci beaucoup d'avance pour vos réponses

3 réponses

  1. Salut,

    pour ce qui est de la boucle :

    int n;// l'entier dont tu cherches a calculer la factorielle
    
    int resultat = 1; // le résultat du calcul
    int i = n; // un indice temporaire
    
    while (i>1)
    {
       resultat = resultat * i;
       i--; // equivalent à i = i-1;
    }
    
    // ici résultat vaut n!
    


    Pour la méthode récursive, c'est plus facile :

    int facto(int n)
    {
        if (n==0) // on teste le cas simple : cas ou n=0
              return 1;
        else
        {
             return n * facto(n-1); // sinon on retourne n * facto(n-1)
        }
    }
    


    Si tu as des questions, n'hésite pas !
    5
    1. Une boucle permet de répéter une action (toujours la même) tant qu'une condition est vraie.
      Par exemple
      tant que i<1
      ecrire trop petit
      lire i
      fin tant que
      

      La boucle for permet de faire plusieurs fois la même action un certains nombre de fois
      c=1
      pour i=1 à i =10 par pas de 1 faire
      c+1
      fin pour

      La boucle a ajouté 1 à C à chaque fois tant que 1 était inférieur à 10.

      Un factoriel c'est multiplier le résultat par l'entier suivant. Par exemple !5 = 1*2*3*4*5
      de là tu peux créer ta boucle. La plus courte est une boucle for, cependant si tu ne l'as pas compris, une boucle while marche très bien.

      Maintenant, un entier cour est signé 8 bits, il va donc de -128 à 127
      un entier long est signé 16 bits, Il faut donc regarde en puissance de 2 : 2^0 + 2^1+2^2+...+2^16. et tu auras le nombre max qu'on peut prendre sachant qu'il y a autant de négatif que de positif à 1 près

      Pour la précision simple, elle prend un certains nombre de décimal, la précision double... en prend le double (fais une recherche sur le web, tu trouveras facilement). Dans ton exo tu travailles sur des entiers... à toi de faire ta conclusion
      3
      1. Modérateur
        Salut,

        Nous n'avons pas encore vu les boucles en cours, alors est-ce que quelqu'un pourrait m'aider à écrire ces programmes ?

        Je ne pense pas que le prof vous a donner des exercices avec les boucles dans les avoir déjà faites pendant les cours.

        Je ne vois pas non plus un effort de ta part pour nous montrer ce que tu as fais.
        Ce que je vois, c'est que tu demandes de faire les exercices à ta place.
        La réponse et là Demander de l'aide pour vos exercices sur CCM
        Par respect pour ceux qui ont déjà posté une solution, je ne vais pas supprimé le message.
        Ca sera pour les suivantes si tu continues dans cette direction.
        Tu as une devinette ici http://www.commentcamarche.net/forum/affich 11290011 devinette en langage c?#1

        Je ferme.
        2