Tantangan
Terapkan saringan Sundaram untuk menemukan bilangan prima di bawah ini n
. Ambil integer input n
,, dan output bilangan prima di bawah ini n
. Anda dapat mengasumsikan bahwa n
akan selalu kurang dari atau sama dengan satu juta.
Saringan
Mulai dengan daftar bilangan bulat dari
1
hinggan
.Hapus semua angka yang ada di formulir di
i + j + 2ij
mana:i
danj
kurang darin
.j
selalu lebih besar atau sama dengani
, yang lebih besar dari atau sama dengan1
.i + j + 2ij
kurang dari atau sama dengann
Lipat gandakan angka yang tersisa dengan
2
, dan tambahkan1
.
Ini akan menghasilkan semua bilangan prima (kecuali 2
, yang harus dimasukkan dalam output Anda) kurang dari 2n + 2
.
Berikut ini adalah animasi dari saringan yang digunakan untuk menemukan bilangan prima di bawah ini 202
.
Keluaran
Output Anda harus setiap bilangan bulat utama ≤ n
(dalam urutan menaik) diikuti oleh baris baru:
2
3
5
Dimana n
adalah 5
.
Contohnya
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Input dilambangkan dengan >
.
(i,j)
dengan i<=j
, tetapi hasilnya tidak berubah jika kami mengabaikan persyaratan ini. Bisakah kita melakukannya untuk menghemat byte?
i <= j
. Itu hanya bagian dari cara kerja ayakan. Jadi ya, Anda dapat meninggalkan i <= j
kode Anda. @xnor
2n+1
) yang bukan dari bentuk 2(i + j + 2ij)+1
- dapatkah kita menguji properti ini langsung pada bilangan potensial atau apakah kode kita harus melakukan kali 2 ditambah 1 pada beberapa titik ?
n
ada di semuanya. Dalam deskripsi metode, dikatakan bahwa itu akan menghasilkan semua bilangan prima hingga 2 * n + 2
. Tetapi dalam uraian input / output, dikatakan bahwa inputnya adalah n
, dan outputnya semuanya siap n
. Jadi apakah kita harus menerapkan metode untuk menghasilkan semua bilangan prima hingga 2 * n + 2
, dan kemudian drop yang lebih besar daripada n
untuk output? Atau haruskah kita menghitung n
deskripsi metode dalam dari input n
?
n=30
29 tidak ada dalam output.