Lors du calcul des factoriels supérieurs à 20 ou plus, la valeur des résultats des factorielles a tendance à être très importante. Le résultat factoriel d'un très petit nombre peut dépasser la gamme des entiers dans l'ordinateur personnel actuel. Si vous avez besoin d'un grand factoriel, par exemple, au-dessus de 1000 ne peut pas être résolu de manière récursive simple. Sur Internet, j'ai vu de nombreux algorithmes sur les grands factoriels entiers écrits en C, C ++ et C #, y compris de nombreux articles classiques mais aussi rugueux. Le tableau traverse la frontière et vous pouvez voir en un coup d'œil que le programme lui-même ne peut pas fonctionner. Lorsque vous réimprimez les articles des autres, jetez de plus près le code. Hélas, rugueux. C'est le Nouvel An chinois, je me sens tellement fatigué à la maison. J'ai soigneusement analysé et utilisé Java pour mettre en œuvre un programme pour calculer le factoriel entier super grand. L'idée est tirée d'Internet et est optimisée et améliorée par moi personnellement.
Cette méthode utilise l'algorithme "Array Carry". Lorsque la plage de valeur des variables informatiques est dépassée, la multiplication à plusieurs chiffres est convertie en multiplication à un chiffre. Comme 11! = 39916800. Si vous avez besoin d'un factoriel de 12, vous devez multiplier 39916800 et 12, et vous pouvez utiliser le taux d'allocation de multiplication. La formule verticale de multiplication est représentée dans la figure ci-dessous:
Utilisez un tableau pour enregistrer le résultat de chaque bit de factorielle et un élément de tableau pour enregistrer le numéro à un chiffre. Par exemple: 399 du résultat factoriel de 11
16800 est enregistré sur les 8 éléments du tableau. Pour calculer le factoriel de 12, multipliez la valeur dans chaque élément de tableau par 12 et enregistrez le résultat sur l'élément de tableau d'origine. Ensuite, nous déterminerons si chaque élément de tableau doit être transporté. Grâce aux opérations de transport, le nombre enregistré par chaque élément du tableau n'est qu'un chiffre. Le diagramme schématique est le suivant:
Théoriquement, tant que l'espace mémoire de l'ordinateur le permet, le résultat factoriel peut être enregistré, ne limite plus par la plage de variables, mais uniquement limitée par la capacité d'adressage du système d'exploitation et de la mémoire de l'ordinateur. Conseils amicaux: Si le numéro factoriel requis est grand, vous pouvez définir le tableau comme un type long pour éviter le débordement lors du calcul du produit du numéro d'unité.
Le code d'implémentation est le suivant:
classe publique BigInteger {/ ** * Calculer le transport * @param Bit Array * @param pos utilisé pour déterminer s'il s'agit du bit le plus élevé de la table <= 9) // pas de transport si moins de 9 {carray = 0;} else if (bit [i]> 9 && i <pos) // supérieur à 9, mais pas le bit le plus élevé {carray = bit [i] / 10; // Enregistrer la valeur de transport bit [i] = bit [i]% 10; // obtenir le seul chiffre bit {while (bit [i]> 9) // boucle bit avant {carray = bit [i] / 10; // calculer la valeur de transport bit [i] = bit [i]% 10; // le premier chiffre actuel i ++; bit [i] = carray; // enregistrer la valeur de transport dans le bit suivant}}}}}} void bigfactorial (int bigInteger) {int pos = 0; // int digit; // longueur de données int a, b; int m = 0; // statistiques chiffres de sortie int n = 0; // lignes de sortie statistiques doubles = 0; // digits d'usine pour (a = 1; a <= biginteger; a ++) // calcul factoriel digits {sum + = math.log10 (a); (int)sum + 1;//Data length int[] fact = new int[digit];//Initialize an array fact[0] = 1;//Suppose the single digit is 1for (a = 2 ; a <= bigInteger ; a++ )//Multiply 2^bigInteger with the original product one by one {for (b = digit-1 ; b >= 0 ; b--)//Find the highest digit {} {if( fait [b]! = 0) {pos = b; // Enregistrez la rupture de bit la plus élevée;}} pour (b = 0; b <= pos; b ++) {fait [b] * = a; // chaque bit est multiplié par i} transport (fait, pos);} pour (b = numérique-1; b> = 0; b -) {if (fact [b]! = 0) {pos = b; Break;}} System.out.println (BigInteger + "Résultat d'usine est:"); pour (a = pos; a> = 0; a -) // résultat de calcul de sortie {System.out.print (fait [a]); m ++; if (m% 5 == 0) {System.out.print ("");} if (40 == M) {System.out.print ("); ; n ++; if (10 == n) {System.out.print ("/ n"); n = 0;}}} System.out.println ("/ n" + "factoriels ont:" + (pos + 1) + "bits");} public Void doBigFactorial (int); this.bigfactorial (bigInteger); int timefinishi = (int) System.currenttimemillis (); int time = timefinishi-timebegin; System.out.println ("Time de calcul:" + temps + "mmec");} public static vide main (string [] args) {bigInteger bi = new BigInteger (); bi.dobigfactorial (100000);}}Calculez le factoriel de 10 000 et affichez ce qui suit:
En conséquence, la console ne peut évidemment pas sauver le contenu. Il y a 450 000 factorielles de 100 000, ce qui équivaut à un roman avec 450 000 mots. Les résultats factoriels de 1000 sont les suivants:
La console peut être affichée en totalité.
Résumer
Ce qui précède est tout le contenu de cet article sur l'explication détaillée de la version Java du code algorithme factoriel entier super grand - niveau 10 000. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
" Analyse du code d'opération Code de la valeur de l'indice de puissance en Java "
" Exemple de code d'implémentation de programmation Java pour exclusivité ou opération des chaînes hexadécimales "
" Programmation Java Implémentation de l'exemple de code algorithme recommandé par le filtrage collaboratif basé sur l'utilisateur "
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!