题目描述:写一个算法来判断一个数是不是"快乐数"。一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐数。
样例:19 就是一个快乐数。
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 1001^2 + 0^2 + 0^2 = 1
逻辑可以这样来理解:现在有两种数,一种经过样例中所示的循环,最后某一时刻为1了,那他们就是快乐数;还有一种数呢,他们经过循环计算后,一直不为1,并且回到了循环过程中的某一个值(那么肯定不论再怎么循环也不会等于1了)。
所以,思路是这样,可以建立一个集合(Python中的集合,是存储不重复元素的),存储循环中每次生成的值(就是样例中19, 82,68。。。)如果某次循环后,值为1,那么就是快乐数;而如果某次循环后的值已经存在于集合中了,那么,当然不是快乐数。
代码如下:
class Solution:
# @param {int} n an integer
# @return {boolean} true if this is a happy number or false
def isHappy(self, n):
record = set()
while True:
record.add(n)
n = self.Next(n)
if n == 1:
return True
elif n in record:
return False
def Next(self, n):
result = 0
while n != 0:
temp = n % 10
result += pow(temp, 2)
n = (n - temp) / 10
return result
# Write your code here
其中,Next函数中用到的分解整数各个位的算法是非常经典且常用的。