チャレンジ一覧に戻る
中級 0件解決済み 正答率0%

指定された上限未満の素数の合計

上限未満のすべての素数を加算してください。

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

  • 篩で上限未満の素数をすべて見つける
  • 1 つずつ判定する代わりに倍数に印を付ける
  • 効率よく合計する

問題

原文(英語)を表示

素数とは、1より大きく、1と自分自身以外で割り切れない整数です。limit より小さいすべての素数を加算してください。limit 自体が素数であっても、合計には含めません。

prime_sum(limit) を実装してください。

入力

limit: 排他的な上限値です。

出力

条件を満たす素数の合計を返してください。該当する素数が存在しない場合は 0 を返してください。

制約

0 ≤ limit ≤ 2,000,000。合計は符号付き64ビット整数で返してください。

例

例 1
入力:
limit = 12

期待される出力:
expected = 28
入力:
long long limit = 12;

期待される出力:
long long expected = 28;
入力:
long limit = 12;

期待される出力:
long expected = 28;

解説

12 未満の素数は 2, 3, 5, 7, 11 です。これらの合計は 28 です。

例 2
入力:
limit = 2

期待される出力:
expected = 0
入力:
long long limit = 2;

期待される出力:
long long expected = 0;
入力:
long limit = 2;

期待される出力:
long expected = 0;

解説

2 未満の素数は存在しません。

解き方のヒント

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

ヒント 1

主なコストは素数を効率よく見つけること。各数の素朴な割り算判定では遅すぎる。

ヒント 2

ふるいのように合成数を印付けし、未印のまま limit 未満の数を足し合わせる。

ヒント 3

limit 自身は素数でも含めないこと。小さい limit では 0 の場合もある。

目安の計算量

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

参考資料

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

他の人の解答から学ぶ

コミュニティの解答

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