在 Python 中检查一个数字是否是快乐数(Happy Number)

如果一个数字,计算每位数字的平方和,再次计算结果的各位数字平方和,然后重复该过程,如果最终结果为 1,那么给定的数字称为快乐数。

例如:N = 19

1 ** 2 + 9 ** 2 = 82

8 ** 2 + 2 ** 2 = 68

6 ** 2 + 8 ** 2 = 100

1 ** 2 + 0 ** 2 + 0** 2 = 1

19 是一个快乐数。

方法1:

算法:

自定义函数,对于给定数字,重复将数字替换为其各位数字的平方和,直到数字等于 1。这个过程中,可能会重复出现某个数字,进入无限循环。因此,将每次计算结果存到集合组合,如果检测到相同的数字出现,则给定数字不是快乐数。

  • 自定义函数 is_Happy_num(n)。

  • 定义空集合 past。

  • 设置使用 while 循环,重复计算每位数字平方和。

  • 将数字转换为字符并遍历,每位转为数字并求和。

  • 将每次计算结果存到集合中,防止出现无限循环。

  • 使用 If 条件语句,判断待计算数字是不是在集合中。

  • 如果语句为 True,则返回 False。

  • 如果计算结果为 1,退出 while 循环,返回 True。

  • 将待检测数字存储在变量 n。

  • 使用 If 条件语句检查 is_Happy_num(n) 的结果。

  • 如果语句为 True,则输出给定的数字是是一个快乐数。

  • 否则,输出给定的数字不是一个快乐数。

def is_Happy_num(n):
  past = set()
  while n != 1:
        n = sum(int(i)**2 for i in str(n))
        if n in past:
            return False
        past.add(n)
  return True
n = 19
if is_Happy_num(n):
    print(n,'是一个快乐数。')
else:
    print(n,'不是一个快乐数。')

方法2:

算法:

使用递归方法检查快乐数。快乐数有一个已被证实的规律:不快乐数的数位平方和计算,最后都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的无限循环体。

  • 自定义函数 is_Happy_num(n)。

  • 将数字转换为字符并遍历,每位转为数字并求和。

  • 如果计算结果为 1,返回 True。

  • 如果计算结果为 小于等于 4,返回 False。

  • 否则,调用函数自身,进行递归。

  • 将待检测数字存储在变量 n。

  • 使用 If 条件语句检查 is_Happy_num(n) 的结果。

  • 如果语句为 True,则输出给定的数字是是一个快乐数。

  • 否则,输出给定的数字不是一个快乐数。

def is_Happy_num(n):
    n = sum(int(i)**2 for i in str(n))
    if n == 1:
        return True
    elif n <= 4:
        return False       
    else:
        return is_Happy_num(n)

n = 19
if is_Happy_num(n):
    print(n,'是一个快乐数。')
else:
    print(n,'不是一个快乐数。')
    

方法3:

算法:

不快乐数最终会进入37 → 58 → 89 → 145 → 42 → 20 → 4 → 16 → 37的无限循环。可以利用环形链表的快慢指针来解决。设定两个指针,慢指针每次调用 SquareSum(n) 一次,快指针每次调用 SquareSum(n) 两次。

class Solution:
    def is_Happy_num(self, n: int) -> bool:
        def SquareSum(n):
            count = 0
            while n >= 10:
                count += (n%10)**2
                n //= 10
            count += n**2
            return count
        
        m = n # 定义第二个指针(快指针)
        while True:
            n = SquareSum(n)
            m = SquareSum(m)
            m = SquareSum(m)
            if m == 1:
                return True
            elif m == n:
                return False

happy = Solution()
n = 4
if happy.is_Happy_num(n):
    print(n,'是一个快乐数。')
else:
    print(n,'不是一个快乐数。')

文章创作不易,如果您喜欢这篇文章,请关注、点赞并分享给朋友。如有意见和建议,请在评论中反馈。