Saat menghitung faktorial melebihi 20 atau lebih, nilai hasil faktorial cenderung sangat besar. Hasil faktorial dari sejumlah kecil dapat melebihi kisaran bilangan bulat di komputer pribadi saat ini. Jika Anda membutuhkan faktorial besar, misalnya, di atas 1000 tidak dapat diselesaikan dengan cara rekursif sederhana. Di internet, saya telah melihat banyak algoritma tentang faktorial integer besar yang ditulis dalam C, C ++ dan C#, termasuk banyak artikel klasik tetapi juga banyak kasar. Array melintasi batas dan Anda dapat melihat sekilas bahwa program itu sendiri tidak dapat berjalan. Saat mencetak ulang artikel orang lain, perhatikan lebih dekat kode. Sayangnya, kasar. Ini Tahun Baru Imlek, saya merasa sangat lelah di rumah. Saya dengan hati-hati menganalisis dan menggunakan Java untuk mengimplementasikan program untuk menghitung faktorial integer super besar. Idenya diambil dari internet dan dioptimalkan dan ditingkatkan oleh saya secara pribadi.
Metode ini menggunakan algoritma "array carry". Ketika kisaran nilai variabel komputer terlampaui, multi-digit aplikasi dikonversi menjadi multiplikasi satu digit. Seperti 11! = 39916800. Jika Anda membutuhkan faktorial 12, Anda perlu mengalikan 39916800 dan 12, dan Anda dapat menggunakan tingkat alokasi multiplikasi. Formula vertikal multiplikasi ditunjukkan pada gambar di bawah ini:
Gunakan array untuk menyimpan hasil dari setiap bit faktorial, dan elemen array untuk menyimpan nomor satu digit. Misalnya: 399 hasil faktorial 11
16800 disimpan ke 8 elemen array. Untuk menghitung faktorial 12, kalikan nilai di setiap elemen array dengan 12, dan simpan hasilnya ke elemen array asli. Selanjutnya, kami akan menentukan apakah setiap elemen array perlu dibawa. Melalui operasi carry, angka yang disimpan oleh setiap elemen dalam array hanya satu digit. Diagram skematik adalah sebagai berikut:
Secara teoritis, selama ruang memori komputer memungkinkan, hasil faktorial dapat disimpan, tidak lagi dibatasi oleh kisaran variabel, tetapi hanya dibatasi oleh kemampuan mengatasi sistem operasi dan memori komputer. Tips Ramah: Jika nomor faktorial yang diperlukan besar, Anda dapat mendefinisikan array sebagai tipe panjang untuk menghindari overflow saat menghitung produk dari nomor unit.
Kode implementasi adalah sebagai berikut:
kelas publik biginteger {/*** Hitung carry* @param bit array* @param pos yang digunakan untuk menentukan apakah itu bit tertinggi dari array*/private void carry (int [] bit, int pos) {int i, carray = 0; for (i = 0; i <= pos; i ++)/ <= 9). bit {while (bit [i]> 9) // loop forward bit {carray = bit [i]/10; // menghitung nilai carry bit [i] = bit [i] % 10; // Digit pertama saat ini i ++; bit [i] = carray; // simpan nilai carry @pound @priver}}}}}}}}}}}}}} besar/** ** ** ** void bigFactorial(int bigInteger){int pos =0;//int digit;//Data length int a , b ;int m = 0 ;//Statistics output digits int n = 0 ;//Statistics output rows double sum = 0;//Factory digits for (a = 1 ; a <= bigInteger ; a ++)//Calculate factorial digits {sum += Math.log10(a);}digit = (int) sum+ 1; // data panjang int [] fact = int baru [digit]; // inisialisasi fakta array [0] = 1; // Misalkan digit tunggal adalah 1 untuk (a = 2; a <= biginteger; a ++) // gandakan 2^biginteger dengan produk asli satu dengan satu {untuk (b = b = {b> {{b> {{{b> {b> {{b> {b> {b> {b> {b> {b> {b = 0; Fakta [B]! = 0) {pos = b; // Rekam bit bit tertinggi;}} untuk (b = 0; b <= pos; b ++) {fakta [b] *= a; // setiap bit dikalikan dengan i} carry (fact, pos);} untuk (b = digit-1; b> = 0; b-) {fact, pos);} untuk (b = digit-1; b> = 0; b-) {fact, pos);} untuk (b = digit-1; b> = 0; b-) {if fact);} (b = digit-1; b> = 0; b-) {if (fact);} (b = digit-1; b> = 0; b-) {if); break;}}System.out.println(bigInteger +"Factory result is: ");for (a = pos ; a >= 0 ; a --)//Output calculation result{System.out.print(fact[a]);m++;if(m % 5 == 0){System.out.print(" ");}if(40 == m ){System.out.println("");m = 0 ;n ++;if(10 == n ){System.out.print("/n");n = 0;}}}System.out.println("/n"+" factorials have: "+(pos+1)+" bits");}public void doBigFactorial(int bigInteger){int timeBegin=(int) System.currentTimeMillis(); this.bigfactorial (biginteger); int timefinishi = (int) system.currentTimeMillis (); int time = timefinishi-timeBegin; System.out.println ("waktu perhitungan:" + waktu + "msec");} public static main (string [] args) {biginteger ") = public static main (string [] args) {biginteg Biginteger (); bi.dobigfactorial (100000);}}Hitung faktorial 10.000 dan tampilkan yang berikut:
Akibatnya, konsol jelas tidak dapat menyimpan konten. Ada 450.000 faktorial 100.000, yang setara dengan novel dengan 450.000 kata. Hasil faktorial 1000 adalah sebagai berikut:
Konsol dapat ditampilkan secara penuh.
Meringkaskan
Di atas adalah semua konten dari artikel ini tentang penjelasan terperinci dari versi Java dari kode algoritma Factory Integer Super Large - Level 10.000. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
" Analisis Kode Operasi Nilai Indeks Daya di Java "
" Contoh Kode Implementasi Pemrograman Java untuk eksklusif atau pengoperasian string heksadesimal "
" Pemrograman Java Mengimplementasikan Contoh Kode Algoritma yang Disarankan Berbasis Pengguna "
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!