Pythonで隣接する桁の絶対差の合計が素数かどうかを判定する方法
問題概要
ある整数 n が与えられたとき、隣り合う桁同士の絶対差の合計が素数であるかどうかを判定するプログラムを作成します。
例えば、入力が n = 574 の場合を考えてみましょう。
- |5 − 7| = 2
- |7 − 4| = 3
- 合計:2 + 3 = 5
5 は素数であるため、この場合の出力は True となります。
解法のアプローチ
この問題は以下の手順で解くことができます。
- 整数 n を文字列に変換し、各桁に簡単にアクセスできるようにします。
- 合計値を格納する変数 total を 0 で初期化します。
- 文字列の先頭から順に、隣接する2つの桁の絶対差を計算して total に加算していきます。
- 最終的な total が素数であれば True を、そうでなければ False を返します。
素数判定関数について
コード内の isPrime 関数は、2 から num - 1 までのすべての整数で割り切れるかどうかを順番に確認するシンプルな試し割り法を採用しています。num が 1 以下の場合は素数ではないため False を返します。より効率化したい場合は、√num まで確認すれば十分です。
実装コード
def isPrime(num):
if num > 1:
for i in range(2, num):
if num % i == 0:
return False
return True
return False
def solve(n):
num_str = str(n)
total = 0
for i in range(1, len(num_str)):
total += abs(int(num_str[i - 1]) - int(num_str[i]))
if isPrime(total):
return True
return False
n = 574
print(solve(n))入力
574
出力
True
処理の流れを詳しく見る
n = 574 の場合、プログラムは次のように動作します。
- まず n を文字列 "574" に変換します。
- i = 1 のとき:|int('5') − int('7')| = 2 を total に加算 → total = 2
- i = 2 のとき:|int('7') − int('4')| = 3 を total に加算 → total = 5
- isPrime(5) が True を返すため、最終的に True が出力されます。
計算量について
桁数を d とすると、絶対差の合計の計算には O(d) の時間がかかります。一方、素数判定は O(total) の時間が必要です。桁数が少ない通常の入力では非常に高速に動作しますが、より大きな数を扱う場合は素数判定を √total までの範囲に絞ることで効率を改善できます。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
Pythonで二分木の隣接ノードが同じ色にならないように着色できるか判定するプログラム
各ノードの値がそのノードの色を表す二分木を考えます。木に含まれる色は最大で2色です。ここで、ノード同士の色を何度でも入れ替えられるとき、辺でつながれた隣接ノード同士が同じ色にならないような配置が可能かどうかを判定します。 たとえば、入力が次のような木だったとします。 この場合の出力は True です。色を入れ替えることで、次のようにすべての隣接ノードが異なる色になる状態を作れるからです。 解法のアプローチ この問題は、次の手順で解くことができます。 colors := 空のマップ(各色を持つノードの個数を記録) prop := 空のマップ(フラグごとのノード数を記録) dfs() 関数