用户:四九圣尊查看:2 回复:13 评论:2 创建时间:2017-07-25T22:01:21
在编程课上猫老祖给了我一个题目:
Write an algorithm to determine if a number is "happy"
(我就不翻译了以您的英语水平肯定会)
我做出了一个验证程序代码如下:
n = int(input("来检测他是不是快乐数!"))
decompose = 0
new = 0
x = 0
buer = 0
while new != 1:
while n != 0:
decompose = n % 10
n = (n - decompose)/10
new = new + decompose ** 2
print ("decompose=",decompose,"new=",new)
if new == 1:
buer = 1
break
if new == 145:
buer = 0
break
if new == 1:
buer = 1
break
n = new
new = 0
if buer == 0:
print("在这个范围内没有找出ta是快乐数的依据!")
else:
print("ta是快乐数!")
exit = input("enter!")
快乐数的检测过程这里tc就自己看吧
。逻辑说不了。
检测过程中我发现只要不是快乐数的数拆来拆去中都会出现一个数字:145(还有一些这样的数我只举例这一个)不是快乐数的数在拆分中会出现循环,它在循环中出现的位置始终不变!
可是为什么会出现它呢?是不是只是巧合(我试了很多数但不敢肯定)
tc有没有办法检测拆分出来的数是否会重复出现?就可以不用这个不严谨的办法了!就是检测其中的循环。请教tc谢谢!
在总结一下,我的问题就是如何从数列中找出循环在没有明确知道循环截的时候。
比如说:233423342334如何让程序知道这是个循环。3657465467527432536...如何让程序知道这不是个循环呢?然后又如何把这个算法镶嵌到我的程序里去?
点赞0
评论
编程猫-GangChen循环的出现就是出现重复的值,所以只需要判断当前这个数是否在前面就已经出现过了就可以了。这里推荐采用set(集合) 。每一次产生数的时候,就检测是不是在set里面,如果在,则出现循环,如果不在,就把它放到set里面。
点赞0
评论
@四九圣尊
你的观察是对的,事实上,如果在快乐数的验证中走到以下这个序列的任意一个数字:
4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4
就一定会发生喵循环。
所以从这里面挑一个数字出来作为非快乐数的验证条件即可。
你选中了145,是对的,也可以选4,也可以选其他。
这是非常严谨的,但是如果没有发现这个循环,就不能发现这个规律。
顺便提一句,快乐数目前为止暂时还没有发现任何的用处,仅仅是数学家们平时自娱自乐的“王者荣耀”,一个游戏。
当年 NASA 曾经向太空发射过质数——用于引起其他文明的注意。可能以后数学家们也会发射些快乐数吧,不过我如果是外星人,恐怕实在理解不了地球人到底想做什么,说不定会很恐慌吧,一点也不快乐。——关于快乐数的一些趣谈。
点赞0
评论