看书、看视频可以帮助你学习代码,但只是辅助。学好Python,最重要的是多打代码,多刷题。本文讲述了快乐数算法问题的多种解决方案,帮助你打开思路。
目录
标题描述:思路:代码:改进版采用递归数学方法。
标题描述:
写一个算法,判断一个数字是否“快乐”。快乐数是这样确定的:从一个正整数开始,用它的位数的平方和代替这个数,重复这个过程,直到最后的数要么收敛到1,永远等于1,要么无穷循环,最后不收敛到1。最终收敛到1的数是快乐数。
比如:19是一个喜庆的数字,计算过程如下:
1^2 9^2=82
8^2 2^2=68
6^2 8^2=100
1^2 0^2 0^2=1
要求:输入快乐数字时,输出真,否则输出假。
想法:
1.当你没有输入一个快乐的数时,你会陷入一个死循环,所以加一个计数器count来统计计算的次数。当计数设置为2000次时,认为该数不是快乐数,跳出循环结束计算。
2.因为不确定输入的数字会有多少位,所以不使用除法和取模的方法来获取数字的每一位,而是使用for循环来获取字符串类型数字的每一位来计算平方和。
代码:
#快乐的数字
def getSumofSquares(数量):
NumStr=str(num) #将要计算的数字转换为字符串类型。
总和=0
digit ls=[int(x for x in numStr]#从字符串中提取每个数字,并将其存储在一个列表中。
#注意:这一步有点多余,因为python中的字符串可以像列表一样分片或者循环。请参见下面的更新部分。
#打印(数字)
对于数字中的I:
总和=i**2
返回总和
def main():
N=input() #输入一个正整数
sumofSqrs=eval(n)
计数=0
而sumofSqrs!=1:
sumofSqrs=getSumofSquares(sumofSqrs)
计数=1
计数2000: #当计算次数超过2000时,跳出循环,结束计算。
打印(“假”)
破裂
否则:
打印(“真”)
主()
改进版
根据网友在评论区提出的不开心的数字,最终会在数字[4,16,37,58,89,145,42,20]中无限循环,你可以加入判断。当数字变成这些数字中的任意一个(比如4),你就结束循环,输出False,这样就避免了无限循环。
修改后的代码:
#(新)快乐数字
def getSumofSquares(数量):
numStr=str(数字)
总和=0
对于numStr中的I:
sum=int(i)**2
返回总和
def main():
N=input() #n是正整数
sumofSqrs=eval(n)
而sumofSqrs!=1和sumofSqrs!=4: # or while sumofsqrs不在[1,4,16,37,58,89,145,42,20]中
sumofSqrs=getSumofSquares(sumofSqrs)
否则:
如果sumofSqrs==1:
打印(“真”)
否则:
打印(“假”)
主()
采用递归
def happy(n):
尝试:
如果n==1:
打印(“真”)
否则:
new=str(n)
总和=0
对于新版本中的c:
sum=int(c)**2
快乐归来(总和)
例外情况为e:
打印(“假”)
#打印(e)
n=eval(输入())
快乐
数学方法
d={}
虽然正确:
m=0
而n 0:
m=(n)**2
n //=10
如果m在d中:
返回False
如果m==1:
返回True
d[m]=m
n=m
最佳化的
类别解决方案(对象):
def isHappy(self,n):
'''
:类型n: int
:rtype: bool
'''
记录=[]
sq_sum=0
硒氮=氮
而se_n!=1:
sq_sum=0
而se_n 0:
sq_sum=(硒氮% 10) *(硒氮% 10)
硒氮=硒氮/10
如果sq_sum在记录中:
返回False
记录.追加(sq_sum)
se _ n=sq _总和
返回True
以上是python算法问题——快乐数的各种解决方案的细节。更多关于python算法问题开心号的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。