Calcul des factoriels
guygugy
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
Dalfab Messages postés 706 Date d'inscription Statut Membre Dernière intervention -
Dalfab Messages postés 706 Date d'inscription Statut Membre Dernière intervention -
Bonjour cher membre, j'aimerai écrire un programme qui détermine expérimentalement le dernier nombre factoriel pouvant être
contenu dans un unsigned long, mais je ne sais comment commencer.
S'il vous plait aidez-moi.
Au plaisir vous lire. Merci.
contenu dans un unsigned long, mais je ne sais comment commencer.
S'il vous plait aidez-moi.
Au plaisir vous lire. Merci.
A voir également:
- Calcul des factoriels
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel gratuit calcul surface m2 - Télécharger - Outils professionnels
1 réponse
Bonjour,
Pour ceci, il faut penser à ce qu'il va se passer si on essaie de calculer la factorielle suivante.
Si on effectue une multiplication dont le résultat dépasse la capacité, et bien on obtient tout simplement un résultat faux!
Il faut trouver un nombre tel que factorielle_ul(x) != x * factorielle_ul(x-1). Le résultat est alors factorielle_ul(x-1).
Il faut pour cela utiliser un type plus grand que unsigned long pour voir la différence.
Ou bien vérifier que le factorielle_ul(x) n'est pas multiple de x-1,x-2, ..., 5,4,3,2.
Le code suivant, je suis sûr marche, mais je ne sais pas expliquer pourquoi.
Pour ceci, il faut penser à ce qu'il va se passer si on essaie de calculer la factorielle suivante.
Si on effectue une multiplication dont le résultat dépasse la capacité, et bien on obtient tout simplement un résultat faux!
Il faut trouver un nombre tel que factorielle_ul(x) != x * factorielle_ul(x-1). Le résultat est alors factorielle_ul(x-1).
Il faut pour cela utiliser un type plus grand que unsigned long pour voir la différence.
Ou bien vérifier que le factorielle_ul(x) n'est pas multiple de x-1,x-2, ..., 5,4,3,2.
Le code suivant, je suis sûr marche, mais je ne sais pas expliquer pourquoi.
unsigned long factMaxUL() { unsigned long fact = 1; for ( unsigned long x = 2 ; ; ++x ) { unsigned long factSuivante = fact * x; if ( factSuivante <= fact ) return fact; // La plus grande est celle du précédent x fact = factSuivante; } }