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   -
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 706 Date d'inscription   Statut Membre Dernière intervention   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