Pythonで配列内の素数要素の合計が素数かどうかを判定する方法
問題の概要
配列 nums が与えられたとき、その配列に含まれるすべての素数要素の合計もまた素数になっているかどうかを判定します。
たとえば、入力が nums = [1, 2, 4, 5, 3, 3] の場合を考えてみましょう。この配列に含まれる素数は 2、5、3、3 の4つで、その合計は 2 + 5 + 3 + 3 = 13 です。13 自身も素数であるため、出力は True となります。
解き方のアプローチ
この問題を効率よく解くには、エラトステネスの篩(ふるい)を使ってあらかじめ素数表を作成しておくのが効果的です。素数表があれば、各要素や合計値が素数かどうかを O(1) で即座に判定できます。
アルゴリズムの手順
- 上限値として
MAX = 10000を定義する - サイズ MAX のブール型リスト
sieveを作成し、すべてTrueで初期化する generate_list_of_primes()関数を定義するsieve[0]とsieve[1]をFalseに設定する(0 と 1 は素数ではないため)- i を 2 から MAX − 1 まで順に処理する:
sieve[i]がTrue(i が素数)の場合、j を i² から MAX まで i 刻みで回しながらsieve[j]をFalseにする(i の倍数はすべて合成数のため)
- メイン処理では以下を実行する:
generate_list_of_primes()を呼び出して素数表を生成する- 合計値
totalを 0 で初期化する - 配列の各要素を走査し、
sieve[要素]がTrueなら素数なのでtotalに加算する - 最後に
sieve[total]がTrueならTrueを返し、それ以外はFalseを返す
実装例
以下が実際のPythonコードです。
MAX = 10000
sieve = [True] * MAX
def generate_list_of_primes():
sieve[0] = False
sieve[1] = False
for i in range(2, MAX):
if sieve[i]:
# i の倍数をふるい落とす(i*i から開始すれば十分)
for j in range(i * i, MAX, i):
sieve[j] = False
def solve(arr):
generate_list_of_primes()
total = 0
for num in arr:
if sieve[num]: # 要素が素数なら加算
total += num
return sieve[total] # 合計が素数かどうかを返す
nums = [1, 2, 4, 5, 3, 3]
print(solve(nums))
入力
[1, 2, 4, 5, 3, 3]
出力
True
ポイントのまとめ
- エラトステネスの篩による素数表の生成は、計算量 O(MAX log log MAX) と非常に高速です。
- 内側のループは
i * iから始めるのが定石です。それ未満の倍数は、より小さい素数の段階ですでにふるい落とされているためです。 - この実装では配列の要素と合計値が
MAX未満である必要があります。扱うデータの範囲に応じてMAXの値を調整してください。
-
Pythonで配列の合計を求める方法を徹底解説
この記事では、Pythonを使って配列(リスト)の合計を求める方法について詳しく解説します。 問題文 問題: 配列が与えられたとき、その配列に含まれるすべての要素の合計を計算してください。 最も基本的なアプローチは、配列全体を走査し、各インデックスの要素を順番に加算していく方法です。ここでは、まず組み込み関数を活用したシンプルな実装例を見ていきましょう。 方法1:組み込み関数 sum() を使う Pythonには、イテラブルなオブジェクトの合計を一発で計算できる組み込み関数 sum() が用意されています。これを使えば、コードは非常に簡潔になります。 サンプルコード # 合計を求める関数 de
-
Pythonで配列(リスト)の合計を求める方法をわかりやすく解説
この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に