Wyzwanie
Zaimplementuj sito Sundaram, aby znaleźć liczby pierwsze poniżej n. Weź liczbę całkowitą wejściową ni wyślij liczby pierwsze poniżej n. Możesz założyć, że nzawsze będzie mniejszy lub równy milionowi.
Sito
Zacznij od listy liczb całkowitych od
1don.Usuń wszystkie liczby, które mają postać
i + j + 2ij:iijsą mniejsze niżn.jjest zawsze większa lub równai, która jest większa lub równa1.
i + j + 2ijjest mniejsza lub równan
Pomnóż pozostałe liczby przez
2i dodaj1.
Spowoduje to, że wszystkie liczby pierwsze (oprócz 2, które powinny być uwzględnione w wynikach) będą mniejsze niż 2n + 2.
Oto animacja sita wykorzystywanego do znajdowania liczb pierwszych poniżej 202.

Wynik
Wynikiem powinna być każda liczba całkowita pierwsza ≤ n(w porządku rosnącym), po której następuje nowa linia:
2
3
5
Gdzie njest 5.
Przykłady
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Wejścia są oznaczone symbolem >.
(i,j)pomocą i<=j, ale wynik nie zmienia się, jeśli zignorujemy to wymaganie. Czy możemy to zrobić, aby zaoszczędzić bajty?
i <= j. To tylko część działania sita. Tak, możesz pominąć i <= jkod. @xnor
2n+1), które nie są w formie 2(i + j + 2ij)+1- czy możemy przetestować tę właściwość bezpośrednio na potencjalnych liczbach pierwszych, czy też nasz kod musi w pewnym momencie wykonać czasy 2 plus 1 ?
njest w całości. W opisie metody napisano, że wygeneruje wszystkie liczby pierwsze do 2 * n + 2. Ale w opisie wejścia / wyjścia napisano, że dane wejściowe są n, a dane wyjściowe są zawsze pierwsze n. Czy więc powinniśmy zastosować tę metodę, aby wygenerować wszystkie liczby pierwsze do 2 * n + 2, a następnie upuścić te większe niż ndla wyniku? Czy też powinniśmy obliczyć nw opisie metody na podstawie danych wejściowych n?
n=30brakuje 29 na wyjściu.