使用Python判断一个正整数在十进制下是不是“快乐数”

快乐数(happy number)有以下的特性:在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进行,最终结果必为1。

def sum_of_square(n):
    s = 0
    while n >= 10:
        s += (n % 10) * (n % 10)
        n = n//10
    else:
        s += n * n
    return s


def is_happy_number(n):
    ever = set()  # 构造一个字典记录所有中间计算出现的数
    while True:
        if n == 1:  # 满足条件
            return True, ever
        elif n in ever:  # 计算的数曾经出现过,表式出现了死循环
            return False, ever
        else:  # 未出现死循环,且数值不为1,继续计算过程
            ever.add(n)
        n = sum_of_square(n)


if __name__ == '__main__':
    while True:
        number = int(input('输入一个正整数(输入非整数结束):'))  # 读取需要测试的数
        if number < 1:
            break
        print(is_happy_number(number))
        
    assert sum_of_square(1) == 1
    assert sum_of_square(2) == 4
    assert sum_of_square(123) == 14
    assert is_happy_number(1)[0] is True
    assert is_happy_number(11)[0] is not True