Program C17 ini menggunakan pembagian percobaan untuk menguji bilangan dan mencantumkan bilangan prima dari 1 sampai batas atas n, termasuk n. Bilangan prima adalah bilangan bulat yang nilainya setidaknya 2, sehingga batas 0 atau 1 tidak menghasilkan bilangan prima. Masukkan satu bilangan bulat desimal dari 0 sampai INT_MAX.
Kode
| |
Kompilasi dan contoh eksekusi
Simpan sebagai primes.c. Di lingkungan yang menyediakan GCC, jalankan gcc -std=c17 -Wall -Wextra -O2 primes.c -o primes, lalu ./primes. Jika memasukkan 30, program menampilkan judul diikuti baris berikut:
| |
Batas 2 menghasilkan 2; 0 atau 1 menghasilkan baris kosong. Masukan berupa satu baris teks dengan panjang paling banyak 127 byte, tidak termasuk karakter baris baru. Karakter spasi putih di awal dan akhir serta tanda + di awal diperbolehkan. Nilai negatif, baris kosong, teks yang bukan bilangan bulat, nilai di luar rentang, baris terlalu panjang, dan kegagalan pembacaan menyebabkan pesan galat dan penghentian program. Hanya baris pertama yang diproses; baris berikutnya tidak digunakan.
Cara kerja pengujian dan penanganan masukan
isPrimemengembalikan salah untuk nilai paling besar 1 dan benar untuk 2 serta 3. Untuk kelipatan 2 atau 3 lainnya, hasilnya salah. Selanjutnya fungsi mengujiidani + 2untuki = 5, 11, 17, .... Kandidat pembagi berbentuk6k - 1atau6k + 1, bukan kelipatan 6. Tidak semua bilangan dengan bentuk ini merupakan bilangan prima.- Setiap bilangan komposit mempunyai faktor prima yang tidak melebihi akar kuadratnya. Karena itu, pengujian selama
i <= num / isudah cukup. Untuk bilangan bulat positif, kondisi ini mencakup rentang yang sama dengani * i <= numsekaligus menghindari luapan perkalian padaint. Tidak perlu menghitung akar kuadrat dengan bilangan titik mengambang. printPrimeshanya mencetak baris kosong jika batasnya kurang dari 2. Jika tidak, fungsi mencetak 2 lalu menguji kandidat ganjil. Jikai > n - 2, perulangan berhenti sebelum penambahan, sehinggai += 2terakhir tidak meluap meskipun batasnyaINT_MAX.readLimitmembaca denganfgets, memeriksa penunjuk akhir konversi danERANGEdaristrtol, lalu memastikan nilainya berada dalam rentang 0 sampaiINT_MAXsebelum dikonversi keint. Argumen untukisspaceterlebih dahulu dikonversi keunsigned char. Mengabaikan nilai balikscanf("%d", &n)dapat menyebabkan penggunaannyang belum diinisialisasi setelah masukan gagal. Hasil konversi di luar rentangintjuga tidak boleh begitu saja dianggap akan diperlakukan sebagai kegagalan konversi biasa.
Cakupan penggunaan
INT_MAX bergantung pada implementasi. Untuk int 32-bit, nilainya 2,147,483,647, tetapi C tidak mewajibkan nilai tersebut di semua implementasi. Mampu merepresentasikan batas bukan berarti semua bilangan prima sampai batas itu dapat dicetak dengan cepat.
Implementasi ini ditujukan untuk mempelajari pembagian percobaan. Untuk satu bilangan, banyaknya pembagian dibatasi oleh nilai yang sebanding dengan akar kuadrat bilangan tersebut. Untuk mencantumkan semua kandidat, batas atas kasarnya adalah O(n sqrt(n)) pembagian. Di sini satu pembagian dihitung sebagai satu operasi; ini bukan kompleksitas bit ataupun waktu eksekusi hasil pengukuran. Untuk mencantumkan prima dalam rentang besar, pertimbangkan saringan Eratosthenes. Program ini bukan pembangkit bilangan prima kriptografis. Untuk menguji bilangan bulat besar, lihat artikel Miller–Rabin.
Aturan fungsi masukan dan aritmetika bilangan bulat C dapat dibaca pada bagian 6.5, 7.4, 7.21.6.2, 7.21.7.2, dan 7.22.1.4 dalam draf komite C11 N1570 dari WG14.
