📅  最后修改于: 2023-12-03 15:42:19.360000             🧑  作者: Mango
这是来自 GATE 计算机科学考试的 2004 年题目中的第 89 题。这道题目需要考生实现一个迭代器,对于一个给定的整数,该迭代器将返回该整数的每一位数字的平方和,直到某一次计算得到的结果为 1 或者该数字在过程中形成了一个循环。此外,还需要实现一个函数判断给出的整数是否是“快乐数”。
本题目要求实现两个函数:
以下是题目提供的模板代码:
def sum_sq_digits(n):
'''
This function takes an integer 'n' and returns the sum of squares of its digits
Example: sum_sq_digits(12) will return 1^2 + 2^2 = 1 + 4 = 5
'''
pass
def is_happy(n):
'''
This function takes an integer 'n' and returns True if it is a happy number, False otherwise
'''
pass
class HappyIter:
'''
This class implements an iterator that returns the sequence of sums of squares of digits of a number, until a cycle is detected or 1 is reached
'''
def __init__(self, n):
self.n = n
def __iter__(self):
return self
def __next__(self):
pass
sum_sq_digits
这个函数接收一个整数 n
,并返回该整数的每一位数字的平方和。例如,当 n=12
时,该函数返回 1^2 + 2^2 = 5。
is_happy
这个函数接收一个整数 n
,并返回一个布尔值。如果数字 n
是“快乐数”,则返回 True
;否则返回 False
。“快乐数”的定义如下:
例如,数字 19 是“快乐数”,因为:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
HappyIter
这个类实现了一个迭代器,该迭代器接收一个正整数 n
,并返回一个序列,每个元素表示对应的数字的每一位数字的平方和,直到得到 1 或者出现循环。例如,当 n=19
时,迭代器会返回序列 (82, 68, 100, 1)
。
对于迭代器实现,可以不断调用 sum_sq_digits
函数,每次计算结果并返回。如果得到了 1,则退出循环;如果出现了循环,则记录每个结果出现的位置,然后在下一次迭代时判断是否出现了循环即可。实现代码如下:
class HappyIter:
def __init__(self, n):
self.n = n
self.seen = set()
def __iter__(self):
return self
def __next__(self):
if self.n == 1:
raise StopIteration
digits = [int(d) for d in str(self.n)]
ssd = sum([d*d for d in digits])
if ssd in self.seen:
raise StopIteration
self.seen.add(ssd)
self.n = ssd
return ssd
上述代码中的 self.seen
是一个集合,用于记录已经出现过的平方和,如果下一次计算出现了已经出现过的平方和,则迭代器即停止迭代。
对于“快乐数”,需要不断迭代计算直到得到 1。如果出现循环,则这个数字不是“快乐数”。实现代码如下:
def is_happy(n):
seen = set()
while n != 1:
digits = [int(d) for d in str(n)]
ssd = sum([d*d for d in digits])
if ssd in seen:
return False
seen.add(ssd)
n = ssd
return True
上述代码中的 seen
是一个集合,用于记录已经出现过的平方和,如果下一次计算出现了已经出现过的平方和,则这个数字不是“快乐数”。
这道题目考察了对迭代器和集合的使用,同时也需要考生对循环的理解和使用。实现起来相对简单,需要注意的就是细节问题,例如边界问题和特殊情况的处理。