Meydan okuma
Uygulamak Sundaram elek altında asal sayılar bulmak için n
. Bir girdi tamsayı alın n
ve aşağıdaki asal sayıları çıktılayın n
. Bunun n
her zaman bir milyondan az veya ona eşit olacağını varsayabilirsiniz .
Elek
Arasındaki tam sayıların bir listeyle başlayın
1
içinn
.Aşağıdaki formdaki tüm sayıları kaldırın
i + j + 2ij
:i
vej
daha küçüktürn
.j
her zaman büyük veya eşittiri
, bu büyük veya eşittir1
.i + j + 2ij
küçük veya eşitn
Kalan sayıları ile çarpın
2
ve ekleyin1
.
Bu, tüm asal sayıları ( 2
çıktınıza dahil edilmeleri dışında ) daha az verir 2n + 2
.
Aşağıda, asalları bulmak için kullanılan eleğin bir animasyonu 202
.
Çıktı
Çıktınız her asal tam sayı ≤ n
(artan sırada) ve ardından yeni satır olmalıdır:
2
3
5
Nerede n
olduğunu 5
.
Örnekler
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Girişler ile gösterilir >
.
(i,j)
ile kontrol eder i<=j
, ancak bu gereksinimi göz ardı edersek sonuç değişmez. Bayt tasarrufu için bunu yapabilir miyiz?
i <= j
. Elek nasıl çalışıyor sadece bir parçası. Yani evet, i <= j
kodunuzda bırakabilirsiniz . @xnor
2n+1
formun değildir) 2(i + j + 2ij)+1
potansiyel asal doğrudan bu özelliği test edebilirsiniz veya kod yapar - sahip bir noktada kez 2 artı 1 yapmak ?
n
içinde olanla biraz kafam karıştı . Yöntem açıklamasında, tüm primerleri üreteceğini söylüyor 2 * n + 2
. Ancak, giriş / çıkış açıklamasında, girişin olduğunu n
ve çıkışın tümünün hazır olduğunu söyler n
. Öyleyse, tüm primerleri üretmek için yöntemi uygulayıp 2 * n + 2
sonra n
çıktıdan daha büyük olanları düşürmemiz gerekiyor mu? Veya n
girişteki yöntem açıklamasında hesaplamalı mıyız n
?
n=30
çıktıda 29 eksik.