Pythonで特定の範囲内のカプレカー数を見つける方法
カプレカー数とは?
修正カプレカー数(Modified Kaprekar Number)とは、d 桁の正の整数 n のうち、その2乗を2つの部分に分割したとき——具体的には、右側の部分 r を d 桁、左側の部分 l を残りの d 桁または d−1 桁としたとき——両者の和が元の数と等しくなる(l + r = n)ような数のことを指します。
たとえば 297 を考えてみましょう。297 の2乗は 88209 です。これを「88」と「209」に分割すると、88 + 209 = 297 となり、確かに元の数へと戻ることがわかります。
指定した範囲内のカプレカー数を求める方法
与えられた範囲内の各数値に対してこの条件を順番にテストすることで、その範囲に含まれるカプレカー数をすべて見つけることができます。以下のサンプルコードでは、数値を2乗して文字列に変換し、考えられるすべての分割位置について「左側+右側=元の数」が成立するかを確認しています。
def print_Kaprekar_nums(start, end):
for i in range(start, end + 1):
# 2乗した値を文字列として取得
sqr = i ** 2
digits = str(sqr)
# 分割位置を1ずつずらしながら、左右の和をチェック
length = len(digits)
for x in range(1, length):
left = int("".join(digits[:x]))
right = int("".join(digits[x:]))
if (left + right) == i:
print(f"Number: {i} | Left: {left} | Right: {right}")
print_Kaprekar_nums(150, 8000)
コードのポイント
i ** 2で対象の数を2乗し、str()で文字列化することで、桁単位の操作を簡単に行えます。- 内側のループで分割位置 x を少しずつ動かすことで、平方数をさまざまな位置で左右に分割して試せます。
- スライス
digits[:x]とdigits[x:]で左半分・右半分を取り出し、それぞれ整数に変換してから加算します。 - 条件(左+右=元の数)を満たした場合のみ、その数をカプレカー数として出力します。
実行結果
上記のコードを実行すると、150 以上 8000 以下の範囲に含まれるカプレカー数が次のように出力されます。
Number: 297 | Left: 88 | Right: 209 Number: 703 | Left: 494 | Right: 209 Number: 999 | Left: 998 | Right: 1 Number: 1000 | Left: 1000 | Right: 0 Number: 2223 | Left: 494 | Right: 1729 Number: 2728 | Left: 744 | Right: 1984 Number: 4879 | Left: 238 | Right: 4641 Number: 4950 | Left: 2450 | Right: 2500 Number: 5050 | Left: 2550 | Right: 2500 Number: 5292 | Left: 28 | Right: 5264 Number: 7272 | Left: 5288 | Right: 1984 Number: 7777 | Left: 6048 | Right: 1729
まとめ
カプレカー数の判定は、「2乗する → 文字列に変換する → 全ての分割位置で左右の和を確認する」というシンプルな手順で実装できます。関数の引数である start と end を変更するだけで、任意の区間におけるカプレカー数を柔軟に探索できる汎用的なコードになっています。
-
Pythonで数値の階乗を求める方法を解説!forループとrange関数の使い方
階乗(factorial)とは、1からその数までのすべての整数を掛け合わせた積のことです。例えば、5の階乗は「5 × 4 × 3 × 2 × 1 = 120」となります。 Pythonで指定した数の階乗を求めるには、range()関数を使って1からその数まで繰り返すforループを作成します。ここで注意すべき点は、range()関数は終了値(ストップ値)を含まないという仕様です。そのため、終了値は入力された数値より1大きい値(num+1)を指定する必要があります。 階乗を求めるPythonコードの例 ループ内では、各数値を変数 f に累積的に掛けていきます。この変数 f は初期値として 1 を設
-
Pythonで自然数の合計を求める3つの方法【while文・for文・sum関数】
Pythonでは、自然数の合計を求める方法がいくつかあります。この記事では、whileループ、forループ、そして組み込み関数sum()を使った3つの方法を、具体的なコード例とともにわかりやすく解説します。 方法1:whileループを使う whileループを使用すると、変数iの値を1ずつ増やしながら、その値を累積的に加算していくことができます。以下の例では、最初の10個の自然数(1から10まで)の合計を計算しています。 s,i=0,0 n=10 while i<n: i=i+1 s=s+i print ("sum of first 10 natural num