中級 0件解決済み 正答率0%

List Primes With a Sieve

Find primes up to a limit by marking composite multiples.

このチャレンジで学べること

  • 真偽値の配列で合成数に印を付ける
  • p × p から消し始める
  • 残った素数を集める

問題

Return all prime numbers from 2 through limit. A prime is an integer greater than 1 divisible only by 1 and itself. Use the sieve idea: keep the next unmarked number and mark its larger multiples as composite. List results in ascending order.

Implement sieve_primes(limit).

Input

limit: The largest number that may be included.

Output

Return the primes in ascending order, or an empty list if none exist.

制約

0 ≤ limit ≤ 100,000. The upper bound is inclusive. Output tests verify results, not the exact algorithm used.

例

例 1
入力:
limit = 12

期待される出力:
expected = [2, 3, 5, 7, 11]
入力:
long long limit = 12;

期待される出力:
std::vector<long long> expected = {2, 3, 5, 7, 11};
入力:
long limit = 12;

期待される出力:
long[] expected = new long[] {2, 3, 5, 7, 11};

解説

Mark multiples of 2 and 3 as composite. The remaining values up to 12 are 2, 3, 5, 7, and 11.

例 2
入力:
limit = 1

期待される出力:
expected = []
入力:
long long limit = 1;

期待される出力:
std::vector<long long> expected = {};
入力:
long limit = 1;

期待される出力:
long[] expected = new long[] {};

解説

Prime numbers begin at 2, beyond this limit.

解き方のヒント

まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。

ヒント 1

未印の素数候補から合成数を印付けし、limit まで続ける。

ヒント 2

最後まで未印の数だけが素数。

ヒント 3

候補の平方が limit を超えたら、それ以上の倍数は印付けしない。

目安の計算量

時間 O(n log log n)、追加メモリ O(n)

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。