Calcul des factoriels

guygugy Messages postés 2 Statut Membre -  
Dalfab Messages postés 720 Statut Membre -
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.
A voir également:

1 réponse

Dalfab Messages postés 720 Statut Membre 101
 
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.
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; 
    }
}
0