Python
 Computer >> コンピューター >  >> プログラミング >> Python

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を返します。これにより、無限ループを確実に防ぐことができます。

  1. Pythonで整数が回文数(パリンドローム)かどうかを判定する方法

    整数が与えられたとき、それが回文数(パリンドローム)であるかどうかを判定する方法を解説します。回文数とは、前から読んでも後ろから読んでも同じ並びになる数値のことです。例えば「454」は逆順にしても「454」となるため回文数です。一方、「-565」を逆順にすると「565-」となり、マイナス記号の位置が変わるため元の数と一致せず、回文数にはなりません。解法の考え方この問題は非常にシンプルに解けます。手順は以下の通りです。1. 数値をstr()で文字列に変換する2. Pythonのスライス記法[::-1]を使って文字列を反転させる3. 元の文字列と反転した文字列を比較し、一致すればTrue、一致しな

  2. Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方

    階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換