In der .NET-Entwicklung umfassen Verschlüsselungs- und Entschlüsselungsalgorithmen manchmal aufgrund des Wissensgehalts einiger Randthemen wie Statistik, Finanzen, Astronomie und anderer Berechnungen eine große Anzahl von Operationen. Selbst wenn der größte numerische Typ in .net gespeichert ist Eine meiner Ideen besteht darin, beim Berechnen numerische Typen zu verwenden und diese (vorübergehend) als Zeichenfolgen auszugeben. Beim Speichern werden dann BOX[n] n Arrays benötigt, um die Ergebnisse eines kleinen Schritts vorübergehend zu speichern Berechnung.
„Als Beispiel
=================== Algorithmus-Verständnisdiagramm =======================
'97*97*97*97*97 = 8587340257 Feld(1) = 587340257 Feld(2)=8
'97*97*97*97*97*97 = 832972004929 Feld(1) = 972004929 Feld(2)=832
'97*97*97*97*97*97*97 = 80798284478113 Box(1) = 284478113 Box(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 Box(1) = 594376961 Box(2)=7837433
'97^ 9 = 760231058654565217 Box(1) = 654565217 Box(2)=760231058
'97^ 10 = 73742412689492826049 Box(1) = 492826049 Box(2)=742412689 Box(3)=73
… … … … … …
Beachten Sie, dass die entsprechende Zahl umso höher ist, je größer das Kästchen in der Tabelle unten ist. Denken Sie bei der Verwendung des obigen Algorithmus daran, ① zuerst die Anzahl der Ziffern eines KASTEN zu definieren, z. B. sind es 9 Ziffern (je nach Bedarf und tatsächlich). Bedingungen),
②Aufgrund der Rechengewohnheiten berechnen viele Leute zuerst die Anzahl der Box(n+1)-Ziffern, wenn sie von der unteren Position {Box(0 -> n)} aus zählen, und fügen dann die von Box(n) generierte Übertragszahl hinzu (z als erstes Berechnen Sie Box(1) bis Box(2)=0, um eine Übertragszahl von 8 (Box(2)+Übertragszahl = 8) für die Verarbeitung zu generieren, wie zum Beispiel die obige Additionsverarbeitung ③ Es ist am besten, von oben zu beginnen Position, Sie werden eine Menge Ärger sparen. Die Anzahl der Felder ist unbekannt. Wenn es voll ist (die Anzahl der Überträge, die durch das Feld mit dem höchsten Index generiert werden), wird ein weiteres hinzugefügt Es gibt eine Modulo-Operation. Wenn der Modul nicht groß ist, können Sie auch die obige Idee verwenden, um den Modul in Teilen zu berechnen und dann zu verknüpfen. Die Box ist ein temporäres Ergebnis und die Box wird neu verteilt (es muss erneut abgeschnitten werden). Wenn es beispielsweise Modulo 123456789123456789 ist, legen Sie ein Feld mit acht Ziffern fest, Feld(2)=91234567, Feld(3)=12345678 ist 123456789123456789 ÷ 333 = 37074110847849 Modul Wenn sich Box(n) nach einmaliger Modulo-Erfassung nicht ändert, ändert sich das Ergebnis der erneuten Modulo-Erfassung nicht und das Ergebnis ist Box(n) = Box(n). Das Programm tritt in eine Endlosschleife ein.
Eine andere Situation, in der es um Operationen mit großen Zahlen geht, besteht darin, das Modulo von A auf die n-te Potenz zu erhöhen (A ^n mod V). Wenn die Mod-Zahl nicht groß ist, kann dies durchgeführt werden (es endet nach n A mod) ((A mod). V)* A mod V) * A mod V... Dieser Algorithmus muss nicht unbedingt rekursiv implementiert werden, es kann eine einfache Schleife mit bis zu zwei Ebenen verschachtelter Schleifen verwendet werden.
Abschließender Rat: Wenn Sie eine große Zahl addieren, subtrahieren, multiplizieren oder dividieren, faktorisieren Sie den Dividenden nicht einfach (Addition/Subtraktion/Multiplikation/Division). Dieser Algorithmus ist sehr ineffizient.
(Der Artikel wurde in Eile geschrieben, es kann Tippfehler geben, bitte verzeihen Sie mir)
Quelle: gleicher BLOG