Pythonでハッピー数(Happy Number)を判定する方法を解説
ハッピー数とは?
ハッピー数(Happy Number)とは、任意の正の整数から始めて「その数を各桁の数字の2乗の和で置き換える」という操作を繰り返し行ったとき、最終的に1に到達する数のことです。1に到達できない場合、計算結果は同じ値のサイクルを永遠に繰り返します。そして、1に到達できた数だけがハッピー数とみなされます。
具体例:19の場合
例えば、数値19がハッピー数かどうかを確認してみましょう。この場合、結果はTrue(ハッピー数である)になります。実際の計算過程は以下の通りです。
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
アルゴリズムの考え方
この問題を解くには、以下の手順に従います。
- メモ化(動的計画法)のアプローチを使用し、再帰的に問題を解きます。
- ベースケース:nが1のとき、Trueを返します。
- nがすでに訪問済みの場合はFalseを返します(無限ループの検知のため)。
- nを訪問済みとしてマークします。
- nを文字列に変換し、各桁の数字からなるリストを作成します。
- 各桁の2乗の合計値を計算します。
- その合計値と訪問済みリストを引数として、関数を再帰的に呼び出します。
Pythonでの実装例
それでは、より理解を深めるために実際のコードを見てみましょう。
class Solution(object):
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
return self.solve(n,{})
def solve(self,n,visited):
if n == 1:
return True
if n in visited:
return False
visited[n]= 1
n = str(n)
l = list(n)
l = list(map(int,l))
temp = 0
for i in l:
temp += (i**2)
return self.solve(temp,visited)
ob1 = Solution()
op = ob1.isHappy(19)
print("Is Happy:",op)入力
19
出力
Is Happy: True
このコードでは、isHappyメソッドが内部のsolveメソッドを再帰的に呼び出しています。辞書型のvisitedで一度計算した値を記録しておき、同じ値が再度現れた場合は循環に入ったと判断してFalseを返します。これにより、無限ループを確実に防ぐことができます。
-
Pythonで整数が回文数(パリンドローム)かどうかを判定する方法
整数が与えられたとき、それが回文数(パリンドローム)であるかどうかを判定する方法を解説します。回文数とは、前から読んでも後ろから読んでも同じ並びになる数値のことです。例えば「454」は逆順にしても「454」となるため回文数です。一方、「-565」を逆順にすると「565-」となり、マイナス記号の位置が変わるため元の数と一致せず、回文数にはなりません。解法の考え方この問題は非常にシンプルに解けます。手順は以下の通りです。1. 数値をstr()で文字列に変換する2. Pythonのスライス記法[::-1]を使って文字列を反転させる3. 元の文字列と反転した文字列を比較し、一致すればTrue、一致しな
-
Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方
階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換