Factorielle en langage C (avec boucle) [Fermé]

Signaler
-
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
-
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

Messages postés
495
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
28 septembre 2010
58
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
481
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
6 avril 2010
142
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 498
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.