Dalam pengembangan .NET, terkadang karena konten pengetahuan dari beberapa mata pelajaran marginal, seperti statistik, keuangan, astronomi, dan perhitungan lainnya, algoritma enkripsi dan dekripsi akan melibatkan operasi dalam jumlah besar. Bahkan jika tipe numerik terbesar di .net disimpan, itu akan meluap.Nomor, salah satu ide saya adalah menggunakan tipe numerik saat menghitung, dan menyimpan (sementara) dan output sebagai string. Kemudian saat menyimpan, array BOX[n] n diperlukan untuk menyimpan sementara hasil langkah kecil di perhitungan.
'Sebagai contoh
==== Diagram Pemahaman Algoritma ========
'97*97*97*97*97 = 8587340257 kotak(1) = 587340257 kotak(2)=8
'97*97*97*97*97*97 = 832972004929 kotak(1) = 972004929 kotak(2)=832
'97*97*97*97*97*97*97 = 80798284478113 kotak(1) = 284478113 kotak(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 kotak(1) = 594376961 kotak(2)=7837433
'97^ 9 = 760231058654565217 kotak(1) = 654565217 kotak(2)=760231058
'97^ 10 = 73742412689492826049 kotak(1) = 492826049 kotak(2)=742412689 kotak(3)=73
… … … … … …
Perhatikan bahwa semakin besar kotak pada tabel di bawah, semakin tinggi angka yang sesuai. Saat menggunakan algoritma di atas, ingatlah untuk ① tentukan terlebih dahulu jumlah digit sebuah KOTAK, misalnya di atas adalah 9 digit (sesuai kebutuhan dan aktual kondisi),
②Karena kebiasaan berhitung, banyak orang yang terlebih dahulu menghitung jumlah digit kotak(n+1) ketika menghitung dari posisi terbawah {kotak(0 -> n)}, lalu menambahkan nomor bawaan yang dihasilkan oleh kotak(n) (seperti sebagai yang pertama Hitung kotak(1) ke kotak(2)=0 untuk menghasilkan nomor bawaan 8 kotak(2)+nomor bawa = 8) untuk diproses, seperti pemrosesan penjumlahan di atas ③ Yang terbaik adalah memulai dari yang tinggi posisi, Anda akan menghemat banyak masalah, Jumlah kotak tidak diketahui. Tidak masalah. Gunakan array dinamis. Jika sudah penuh (jumlah carry yang dihasilkan oleh kotak subskrip tertinggi), tambahkan yang lain ada operasi modulo, jika modulusnya tidak besar, Anda juga dapat menggunakan ide di atas untuk menghitung modulus dalam beberapa bagian dan kemudian menghubungkannya. Kotak tersebut adalah hasil sementara, dan kotak tersebut didistribusikan kembali (harus dipotong ulang posisi tinggi). Misalnya, jika modulo 123456789123456789, atur kotak dengan delapan digit. kotak(1)=89 kotak(2)=91234567 kotak(3)=12345678 IS 123456789123456789 ÷ 333 = 370741108478849 Modulus adalah 72) maka kotak yang didistribusikan kembali harus menjadi kotak (1) = 478849 Kotak (2) = 37074. posisi tinggi. Jika kotak(n) tidak berubah setelah di modulo satu kali, hasil pengambilan modulus kembali tidak berubah dan hasilnya kotak(n) = kotak(n).
Situasi lain yang melibatkan operasi bilangan besar adalah dengan mengambil modulo A dipangkatkan ke-n (A ^n mod V). Jika jumlah mod tidak besar, maka dapat dilakukan (berakhir setelah n A mod) ((A mod V)* Sebuah mod V) * Sebuah mod V... Algoritma ini tidak perlu diimplementasikan secara rekursif, loop sederhana dapat digunakan, dengan maksimal dua level loop bersarang.
Saran terakhir: Saat menjumlahkan, mengurangi, mengalikan atau membagi suatu bilangan besar, jangan mudah memfaktorkan pembagiannya (penjumlahan/pengurangan/perkalian/pembagian Algoritma ini akan sangat tidak efisien.
(Artikel ini ditulis terburu-buru, mungkin ada kesalahan ketik, mohon maaf)
Sumber: BLOG yang sama