Python程序:检查给定数字是否为快乐数
快乐数是指一个正整数,每次将该数替换为它每个位置上的数字的平方和,重复进行这个过程直到这个数字变为1,或者无限循环但始终变不到1。如果可以变为1,那么这个数字就是一个快乐数。例如,19是一个快乐数,因为:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
下面是一个Python程序,用来检查给定数字是否为快乐数:
def isHappy(n: int) -> bool:
loop_dict = {}
while n != 1 and n not in loop_dict:
loop_dict[n] = True
n = sum([int(digit) ** 2 for digit in str(n)])
return n == 1
通过给定一个整数n,该程序运算检查是否为快乐数。程序通过一个字典loop_dict
记录已经检查过的数字,以避免重复检查。程序将数字变为它每个位置上的数字的平方和,并检查是否已经在之前的检查过程中出现过。
以下是一个简单的测试代码,用来检查数字是否为快乐数:
print(isHappy(19)) # True
print(isHappy(4)) # False
这个程序的性能并不是很好。它最坏的情况下需要的时间复杂度是O(log n)。更好的解决方案可以通过使用Floyd循环检测算法,该算法通过使用两个指针来检测循环。
以下是一个使用Floyd算法实现的快乐数检查Python程序:
def isHappy(n: int) -> bool:
slow, fast = n, n
while True:
slow = sum([int(digit) ** 2 for digit in str(slow)])
fast = sum([int(digit) ** 2 for digit in str(fast)])
fast = sum([int(digit) ** 2 for digit in str(fast)])
if slow == fast:
break
return slow == 1
该程序使用两个指针来检测循环。其中,fast指针每次都会比slow指针多进行一次“变幻”,如果存在循环,那么fast一定可以“追到”slow。再通过快速检查slow是否等于1,即可得出结论。
以下是一个简单的测试代码,用来测试Floyd算法实现的快乐数检查程序。
print(isHappy(19)) # True
print(isHappy(4)) # False
结论
Python程序可以用来检查给定的数字是否为快乐数。使用字典来记录检查过程可以避免重复检查,而使用Floyd算法实现的程序可以更快速地检查给定的数字。