Penjana Nombor Perdana Mudah dalam Python
Kod ini bertujuan untuk menjana senarai nombor perdana yang ringkas, tetapi pada masa ini ia hanya mencetak kiraan , tidak kira sama ada nombor itu perdana atau tidak.
Masalahnya
Kod menggunakan gelung bersarang untuk menyemak kebolehbahagi pembilang (bilangan) dengan nombor daripada 2 kepada punca kuasa dua kiraan. Walau bagaimanapun, ia secara salah mengandaikan bahawa jika nombor tidak boleh dibahagikan dengan lelaran semasa bagi gelung dalam, ia mestilah perdana.
Pembetulan
Untuk menangani isu ini , kami memperkenalkan pembolehubah boolean, isprime, untuk menjejak status prima kiraan. Dalam gelung dalam, jika kiraan boleh dibahagikan dengan nilai semasa x, kami menetapkan isprima kepada False dan memecahkan gelung. Ini memastikan bahawa kami hanya mencetak kiraan jika ia benar-benar prima.
Pelaksanaan Dioptimumkan
Walaupun kod ini memberikan pemahaman asas tentang penjanaan perdana, pendekatan yang lebih cekap dikenali sebagai penapis Eratosthenes boleh digunakan. Teknik ini bermula dengan menganggap semua nombor adalah perdana dan kemudian berulang melalui jujukan, menandakan bukan nombor perdana sebagai komposit.
Berikut ialah pelaksanaan Sieve of Eratosthenes yang sangat dioptimumkan:
def gen_primes(): D = {} q = 2 while True: if q not in D: yield q D[q * q] = [q] else: for p in D[q]: D.setdefault(p + q, []).append(p) del D[q] q += 1
Ini kod mengembalikan penjana yang menghasilkan nombor perdana. Ia menggunakan sistem pemetaan yang cekap ingatan untuk mengesan komposit dan saksinya. Pengoptimuman ini dengan ketara mengurangkan masa dan sumber pengiraan yang diperlukan untuk menjana nombor perdana yang besar.
Atas ialah kandungan terperinci Mengapa kod Python ini hanya mengira nombor perdana tetapi tidak mencetaknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!