Meydan okuma
Uygulamak Sundaram elek altında asal sayılar bulmak için n. Bir girdi tamsayı alın nve aşağıdaki asal sayıları çıktılayın n. Bunun nher zaman bir milyondan az veya ona eşit olacağını varsayabilirsiniz .
Elek
Arasındaki tam sayıların bir listeyle başlayın
1içinn.Aşağıdaki formdaki tüm sayıları kaldırın
i + j + 2ij:ivejdaha küçüktürn.jher zaman büyük veya eşittiri, bu büyük veya eşittir1.
i + j + 2ijküçük veya eşitn
Kalan sayıları ile çarpın
2ve 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 nolduğ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 <= jkodunuzda bırakabilirsiniz . @xnor
2n+1formun değildir) 2(i + j + 2ij)+1potansiyel asal doğrudan bu özelliği test edebilirsiniz veya kod yapar - sahip bir noktada kez 2 artı 1 yapmak ?
niç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 nve çı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 + 2sonra nçıktıdan daha büyük olanları düşürmemiz gerekiyor mu? Veya ngirişteki yöntem açıklamasında hesaplamalı mıyız n?
n=30çıktıda 29 eksik.