Factorielle en langage C (avec boucle)

Fermé
Utilisateur anonyme - 28 févr. 2009 à 11:40
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 28 févr. 2009 à 12:05
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

sebastien61 Messages postés 495 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 28 septembre 2010 59
28 févr. 2009 à 11:53
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
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
28 févr. 2009 à 11:55
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 févr. 2009 à 12:05
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