【Python】数字AとBのみで構成される数値がNを割り切れるかどうかを判定する方法
数値 n が与えられ、さらに2つの数値 a と b があるとします。このとき、「a と b のみを使って生成できる数値」の中に、n を割り切るものが存在するかどうかを判定する必要があります。
例えば、入力が n = 115、a = 3、b = 2 の場合、出力は True になります。これは、2と3だけで構成される数値「23」が 115 を割り切れる(115 ÷ 23 = 5)ためです。
解決のアプローチ
この問題は再帰的な探索によって解決できます。a と b を末尾に付け加えながら数値を伸ばしていき、その都度 n を割り切れるかを確認します。具体的な手順は以下の通りです。
- 関数
util()を定義します。引数はtemp、a、b、nです。 temp > nの場合、これ以上数値を伸ばしても意味がないためFalseを返します。nがtempで割り切れる場合、条件を満たす数値が見つかったのでTrueを返します。- それ以外の場合は、
tempの末尾に a を追加したutil(temp * 10 + a, a, b, n)と、末尾に b を追加したutil(temp * 10 + b, a, b, n)を再帰的に呼び出し、少なくとも一方がTrueであればTrueを返します。 - メインの
solve()関数では、開始点としてutil(a, a, b, n)またはutil(b, a, b, n)を呼び出し、少なくとも一方がTrueであればTrueを返します。
実装例
以下にPythonでの実装例を示します。
def util(temp, a, b, n):
if temp > n:
return False
if n % temp == 0:
return True
return util(temp * 10 + a, a, b, n) or util(temp * 10 + b, a, b, n)
def solve(n, a, b):
return util(a, a, b, n) or util(b, a, b, n)
n = 115
a = 3
b = 2
print(solve(n, a, b))入力
115, 2, 3
出力
True
コードのポイント
- 枝刈り(pruning):
temp > nとなった時点で探索を打ち切ることで、無駄な再帰呼び出しを防いでいます。 - 再帰による全探索:a と b を組み合わせて作れるすべての数値を効率的に網羅できます。
- 計算量:最悪の場合、桁数に対して指数的に増加しますが、枝刈りにより実際の探索範囲は大きく絞られます。
このように、シンプルな再帰処理を用いることで、「指定された数字だけで構成される約数が存在するか」という問題を簡潔に解決できます。
-
【Python】配列内のすべての桁を使って3で割り切れる数を作成できるか判定する方法
この記事では、与えられた問題文を解決するための解法とアプローチについて詳しく解説します。 問題文 整数の配列が入力として与えられたとき、これらの数値に含まれるすべての桁を使用して、3で割り切れる整数を作成できるかどうかを判定する必要があります。 ここでは、整数の配列と配列の長さという2つの引数を受け取る関数を作成します。 解法のポイント この実装は、暗算でよく使われる数学的な性質に基づいています。それは次の通りです。 「ある数の各桁の合計が3で割り切れるならば、その数自体も3で割り切れる」 この性質を利用すると、実際に桁を組み合わせて数値を生成する必要はなく、配列内の各要素について3で割った余
-
【Python】セットから要素を削除するプログラム:pop()メソッドの使い方
「集合(セット)」という言葉は、数学の世界でもおなじみですね。Pythonにおけるセットは、数学の集合に相当するデータ構造です。セットにはさまざまな要素を格納でき、要素の順序は定義されません(順序を持たないコレクションです)。セットでは要素の追加や削除が自由に行え、要素の反復処理のほか、和集合・積集合・差集合といった標準的な集合演算も実行できます。この記事では、セットから要素を削除する方法を解説します。ここでは pop() メソッドを使用します。pop() はPythonの組み込みメソッドで、セットから要素を1つずつ取り出しながら削除していくために使われます。実行例NEW SET IS ::&