Calcul des factoriels
Fermé
guygugy
Messages postés
1
Date d'inscription
samedi 16 avril 2016
Statut
Membre
Dernière intervention
16 avril 2016
-
16 avril 2016 à 15:33
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 16 avril 2016 à 16:17
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 16 avril 2016 à 16:17
A voir également:
- Calcul des factoriels
- Calcul moyenne excel - Guide
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel calcul surface terrain gratuit - Télécharger - Outils professionnels
- Logiciel calcul plancher hourdis gratuit - Forum Architecture / décoration
1 réponse
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
16 avril 2016 à 16:17
16 avril 2016 à 16:17
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; } }