Stocker un nombre supérieur à 20! (factoriel)

J’essaie de trouver les numéros jusqu’à 100! (factoriel) mais après 20! cela donne une erreur car la valeur est trop grande pour être gérée. Comment puis-je stocker un tel numéro?

20 factorial est composé de 19 chiffres. 100 factorial, c’est 158 ​​chiffres, prenant 500 bits! C’est en fait:

 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000 00000000 

Aucun des types standard ne fonctionnera pour vous ici, ce que vous devrez faire est d’implémenter votre propre routine pour gérer de tels nombres.

Par exemple, vous devrez accepter le fait que la multiplication de deux valeurs 32 bits peut donner un résultat 64 bits.

C’était une pratique courante pour calculer de grands nombres à l’époque des processeurs 8 bits. C’est ce qu’on appelle l’ arithmétique de précision arbitraire.

Voici un lien pour décrire comment cela a été fait. Certes, c’est pour l’assembleur, mais c’est toujours vrai ici. Vous devrez prendre en compte les tailles par défaut de int sur votre système.

Au moins sous Linux, une bibliothèque multi-précision possible pourrait être GMP (elle fonctionne également sous Solaris, Windows, MacOSX, etc.).

Comment le ferais-tu sur papier?
Faire des multiplications avec des nombres de 160 chiffres n’est pas si difficile pour un ordinateur.

Essayez d’écrire votre propre fonction ou d’utiliser une bibliothèque existante.

Ce code aidera jusqu’à 170! . Utilisez double pour la fonction factorielle, parce que normal int ou long int ne prend pas en charge ce résultat factoriel, double prendra en charge jusqu’à 1.7e308 .

 #include double fact(int k){ int i; double f=1; for(i=1;i<=k;i++) f=f*i; return (f); } int main(){ int i; for(i=1;i<=65;i++) printf("%d! = %.3lf\n",i,fact(i)); return 0; }