Pythonで「異なる数のn乗の和」として表せる組み合わせの数を求めるプログラム
問題の概要
ある数 x ともうひとつの数 n が与えられます。このとき、「互いに異なる(一意な)数の n 乗の和」として x を表す方法が何通りあるかを求めるのがこの問題です。
たとえば x = 100、n = 2 の場合、出力は 3 になります。これは以下の 3 通りの表現が可能だからです。
- 62 + 82
- 102
- 12 + 32 + 42 + 52 + 72
アルゴリズムの考え方
この問題は再帰呼び出しを用いて解くのが自然です。手順は以下のとおりです。
- 答えを保持する変数
ansを 0 で初期化します。 - 4つの引数
x、n、cn(現在検討中の数)、cs(それまでの累積和)を受け取るメソッドsolve()を定義します。csの初期値は 0、cnの初期値は 1 です。 p := cnnを計算します。p + cs < xである間、以下を繰り返します。ans := ans + solve(x, n, cn + 1, p + cs)cn := cn + 1p := cnn
p + csがちょうどxと一致したら、ans := ans + 1とします。- 最後に
ansを返します。
このアルゴリズムでは、各候補の数について「その数を採用して和に加える」か「スキップして次の候補へ進む」かを再帰的に探索していきます。これにより、同じ数を二度使わないという条件を満たしたまま、すべての組み合わせを漏れなく調べることができます。
Pythonでの実装例
理解を深めるために、実際のコードを見てみましょう。
from math import pow
def solve(x, n, cn=1, cs=0):
ans = 0
p = pow(cn, n)
while p + cs < x:
ans += solve(x, n, cn + 1, p + cs)
cn = cn + 1
p = pow(cn, n)
if p + cs == x:
ans = ans + 1
return ans
x = 100
n = 2
print(solve(x, n))
入力
100, 2
出力
3
補足:より安全なべき乗の計算方法
math.pow() は結果を浮動小数点数(float)として返すため、非常に大きな数を扱う場合には誤差が発生する可能性があります。Pythonでは組み込み演算子 ** を使うことで、任意精度の整数のままべき乗を計算できます。
# math.pow の代わりに ** 演算子を使用
p = cn ** n
このように書き換えることで、大きな x や n を扱うケースでも正確な結果を得られます。
-
PythonでN番目のフィボナッチ数を求めるプログラム
数値 n が与えられたとき、n番目のフィボナッチ数を求めるプログラムをPythonで作成してみましょう。フィボナッチ数列とは、i番目の項が f(i) = f(i-1) + f(i-2) という漸化式で定義される数列です。最初の2項は 0 と 1 であり、それ以降の各項は直前の2つの項の和になります。数列を並べると「0, 1, 1, 2, 3, 5, 8, 13, 21, ...」のように続いていきます。例えば、入力が 15 の場合、15番目のフィボナッチ数である 610 が出力されます。解き方の手順この問題は反復処理(ループ)を使うことで効率的に解けます。手順は以下の通りです。変数 first
-
Pythonプログラムで数の偶数の約数の合計を求める方法
この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文:ある数が与えられたとき、その数のすべての偶数の約数(因子)の合計を求めて表示します。 アプローチ まず、与えられた数が奇数であるかどうかを確認します。奇数には偶数の約数が存在しないため、その場合は 0 を返します。 数が偶数である場合は、実際の計算に進みます。ここでのポイントは、20(つまり1)以外のすべての項を掛け合わせることで、偶数の約数の合計が得られるという点です。 偶数の約数からすべての奇数を取り除くために、20 に相当する「1」を無視します。この処理を行うことで、残るのは偶数の約数のみとなります。なお、2 は