📜  门| GATE-IT-2004 |第 89 题(1)

📅  最后修改于: 2023-12-03 15:42:19.360000             🧑  作者: Mango

题目简介

这是来自 GATE 计算机科学考试的 2004 年题目中的第 89 题。这道题目需要考生实现一个迭代器,对于一个给定的整数,该迭代器将返回该整数的每一位数字的平方和,直到某一次计算得到的结果为 1 或者该数字在过程中形成了一个循环。此外,还需要实现一个函数判断给出的整数是否是“快乐数”。

题目详解

题目要求

本题目要求实现两个函数:

  1. 一个迭代器,接收一个正整数作为输入,每次迭代返回该整数的每一位数字的平方和,直到结果为 1 或者循环出现。
  2. 一个函数,接收一个正整数作为输入,返回该整数是否为“快乐数”。
模板代码

以下是题目提供的模板代码:

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。“快乐数”的定义如下:

  1. 开始时给定一个正整数。
  2. 将这个数字的每一位数字求平方和。
  3. 如果得到的结果是 1,则这个数字是“快乐数”;否则返回步骤 2 的结果并继续执行步骤 2。
  4. 如果在执行步骤 2 的过程中,出现了某个结果已经出现过的情况,即出现了循环,则这个数字不是“快乐数”。

例如,数字 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 是一个集合,用于记录已经出现过的平方和,如果下一次计算出现了已经出现过的平方和,则这个数字不是“快乐数”。

总结

这道题目考察了对迭代器和集合的使用,同时也需要考生对循环的理解和使用。实现起来相对简单,需要注意的就是细节问题,例如边界问题和特殊情况的处理。