1. Konsep
Pertama, mari kita mengerti apa itu nomor sempurna?
Deskripsi Masalah: Jika angka alami, jumlah dari semua faktor aslinya (mis., Pembagi selain dari dirinya sendiri) persis sama dengannya, dan angka ini disebut nomor lengkap. Disingkat "nomor jadi"
Misalnya,
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064
Menurut definisi angka jadi, tidak terlalu sulit untuk menyelesaikan angka menggunakan program. Pertama, selesaikan semua faktor sebenarnya dari angka ini, kemudian tambahkan mereka untuk menentukan apakah itu sama dengan itu. Namun, ketika angka ini sangat kecil, tidak ada masalah. Setelah angka ini melebihi nilai tertentu, masalah muncul dan efisiensi eksekusi program akan dihina.
Ketika kami mengoptimalkan logika algoritma program, kami sering mempertimbangkan pertanyaan: bagaimana memanfaatkan karakteristik komputer secara efisien? Apakah ada banyak pekerjaan yang tidak berguna yang berulang dalam algoritma yang ditentukannya? Dengan mempertimbangkan masalah ini di sepanjang garis pemikiran ini, kami akan segera mendapatkan solusi lain.
2. Deskripsi
2.1 Analisis
Di sini, akankah kita dengan mudah memikirkan faktor dekomposisi yang kita sebutkan sebelumnya? Ya, saat memecahkan angka yang sempurna, kami akan menggunakan faktor dekomposisi. Secara umum, menyelesaikan angka yang sempurna akan melalui tiga langkah:
1. Temukan sejumlah bilangan prima tertentu
2. Gunakan tabel bilangan prima untuk menemukan faktorisasi dari angka yang ditentukan
3. Gunakan faktorisasi untuk menemukan semua faktor yang benar dan periksa apakah itu angka yang sempurna
2.2 Kesulitan
Setelah tampilan pertama, tidak ada masalah dengan langkah pertama dan kedua. Kami telah membahasnya di dua artikel sebelumnya. Siswa yang tidak jelas dapat memeriksanya.
Poin kunci adalah pada langkah ketiga, bagaimana menemukan jumlah faktor yang sebenarnya? Metode ini sangat sederhana. Anda harus terlebih dahulu tahu bahwa menambahkan semua faktor sejati (siswa yang tidak tahu konsep faktor sejati, pergi dan melihat -lihat) dan menambahkan angka itu sendiri akan menjadi dua kali angka (beberapa siswa tidak tahu, tetapi mereka harus mengetahuinya sekarang, kan?), Misalnya:
2 * 28 = 1 + 2 + 4 + 7 + 14 + 28
Bahkan, persamaan ini dapat dikonversi ke: (kesalahan input kode, saya menggunakan tangkapan layar)
Telah menemukan? 2 dan 7 keduanya menjadi faktor faktor, jadi apakah ada penyederhanaan program?
2.3 Kesimpulan
Hanya faktorisasi yang diperlukan, dan Anda dapat menggunakan loop untuk menemukan nilai setelah persamaan, dan membagi nilai dengan 2 menjadi jumlah faktor sebenarnya; Ketika Anda pertama kali melihat persamaan, Anda mungkin berpikir untuk menggunakan rumus seri persamaan untuk menyelesaikannya, tetapi Anda akan menggunakan operasi daya. Anda dapat menghitung nilai setelah persamaan pada saat yang sama saat membaca array faktorisasi.
3. Kode
impor java.util.arraylist; // Selesaikan angka sempurna kelas publik PerfectNumber {// pass dalam nilai dan selesaikan setidaknya berapa banyak angka sempurna int statis publik int [] lessthan (int number) {int [] primes = prime.findprimes (angka); Daftar ArrayList = ArrayList baru (); untuk (int i = 1; i <= angka; i ++) {int [] factor = factor (primes, i); if (i == fsum (faktor)) list.add (bilangan bulat baru (i)); } int [] p = int int [list.size ()]; Objek [] objs = list.toArray (); untuk (int i = 0; i <p.length; i ++) {p [i] = ((integer) objs [i]). intvalue (); } return p; } // Dekomposisi faktor privat statis int [] faktor (int [] bilangan prima, angka int) {int [] frecord = int int [angka] baru; int k = 0; untuk (int i = 0; math.pow (primes [i], 2) <= number;) {if (angka % primes [i] == 0) {frecord [k] = primes [i]; K ++; angka /= primes [i]; } lain i ++; } frecord [k] = angka; mengembalikan frecord; } // Factor Sum Private Static int fsum (int [] farr) {int i, r, s, q; i = 0; r = 1; s = 1; q = 1; while (i <farr.length) {do {r *= farr [i]; q += r; i ++; } while (i <farr.length - 1 && farr [i -1] == farr [i]); s *= q; r = 1; q = 1; } return s / 2; } public static void main (string [] args) {int [] pn = PerfectNumber.Lessthan (1000); untuk (int i = 0; i <pn.length; i ++) {System.out.print (pn [i]+""); } System.out.println (); }}Meringkaskan
Di atas adalah semua tentang analisis kode angka sempurna dalam artikel ini, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya!