问题描述
如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。对新产生的正整数再做同样的处理,如此一来,你会发现,不管开始取的是什么数字,最终如果不是落入1,就是落入同一个循环圈。请输出这个循环圈中最大的那个数字。
解决方案
先创立一个空列表,把每个新产生的正整数加进去,如果在一个新产生的正整数加进去时,列表里面已经有了这个正整数,那就表明已经找到了这个循环圈。接着输出列表最大数就完成题目要求。
但是,如何知道新产生的正整数已经存在列表中。因为这道题是要找循环圈,不知道要按平方和处理多少次的,所以基本都是采用while循环,但如果在while循环后面的条件是新产生的正整数不在列表内,后面总有一步是列表添加新的正整数,所以while循环只能循环1次,第2次就结束。
因此,采用了set函数,以len(set(list)) == len(list)作为while循环的条件,此时当列表中有两个相同的正整数时,循环结束,意味着找到了循环圈。
代码示例:
a = int(input()) #输入一个正整数,注意不要输入1,10,100,23等数lis = [] #创立一个空列表while len(set(lis)) == len(lis):a, b = 0, a #a恢复为0,便于储存平方和;并且a赋值给b,使其进行下一次循环for i in list(str(b)):a += int(i)**2lis.append(a)print(max(lis)) |
---|
结语
这道题没什么难点,唯一重要的就是如何结束循环,找到怪圈。这道题其实还可以添加一个新产生的数,例如为1,就结束循环或者对原数进行某种更改(比如加1减2)的代码。因为有些数是不能找到这个怪圈的,就比如1,10,100这种数。