python 算法题——快乐数的多种解法


Posted in Python onMay 27, 2021

题目描述:

编写一个算法来确定一个数字是否“快乐”。 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于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
要求:当输入快乐的数字时,输出True,否则输出False。

思路:

1. 当输入的不是快乐数字时,会陷入一个无限循环,因此增加一个计数器 count 用来统计计算次数。设定当 count 达到2000次时,认为该数字不是快乐数字,跳出循环结束计算。
2. 因为不确定输入的数字会是几位数,因此不采用除法和取模的方法来获得数字的每一位数,而是利用 for 循环获取字符串类型数字的每一位来计算平方和。

代码:

#快乐的数字
def getSumofSquares(num):
    numStr=str(num) #将待计算的数字转换成字符串类型
    sum=0
    digitls=[int(x) for x in numStr] #从字符串中提取出每一位数字存入一个列表
    #注:该步略显多余,因为python中字符串可以和列表一样切片取值或循环,见下方更新部分
    #print(digitls)
    for i in digitls:
        sum += i**2
    return sum

def main():
    n = input() #输入一个正整数
    sumofSqrs = eval(n)
    count = 0
    while sumofSqrs != 1:
        sumofSqrs = getSumofSquares(sumofSqrs)
        count += 1
        if count > 2000: #当计算次数超过2000次时,跳出循环结束计算
            print("False")
            break
    else:
        print("True")

main()

改良版

根据网友在评论区提出的不快乐的数字最终会在 [4,16,37,58,89,145,42,20] 这些数字中无限循环,因此可以加入判断,当数字变为这些数字里的任意一个(比如4)时就结束循环,输出False,从而避免无限循环的产生。

修改后的代码:

#(新)快乐的数字
def getSumofSquares(num):
    numStr=str(num)
    sum=0
    for i in numStr:
        sum += int(i)**2
    return sum

def main():
    n = input() #n为一个正整数
    sumofSqrs = eval(n)
    while sumofSqrs != 1 and sumofSqrs != 4: #或 while sumofSqrs not in [1,4,16,37,58,89,145,42,20]
        sumofSqrs = getSumofSquares(sumofSqrs)
    else:
        if sumofSqrs == 1:
            print("True")
        else:
            print("False")

main()

采用递归

def happy(n):
        try:
                if n==1:
                        print('True')
                else:
                        new = str(n)
                        sum = 0
                        for c in new:
                                sum += int(c)**2
                        return happy(sum)
        except Exception as e:
                print('False')
                # print(e)

n = eval(input())
happy(n)

数学方法

d = {}
        while True:
            m = 0
            while n > 0:
                m += (n%10)**2
                n //= 10 
            if m in d:
                return False
            if m == 1:
                return True
            d[m] = m
            n = m

优化过的

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        record = []
        sq_sum = 0
        se_n = n

        while se_n != 1:
            sq_sum = 0
            while se_n > 0:
                sq_sum += (se_n % 10) * (se_n % 10)
                se_n = se_n / 10
            if sq_sum in record:
                return False
            record.append(sq_sum)
            se_n = sq_sum

        return True

以上就是python 算法题——快乐数的多种解法的详细内容,更多关于python 算法题快乐数的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中强大的命令行库click入门教程
Dec 26 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Python 类的继承实例详解
Mar 25 Python
python中matplotlib实现最小二乘法拟合的过程详解
Jul 11 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
使用Python写一个小游戏
Apr 02 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
Python中新式类与经典类的区别详析
Jul 10 Python
numpy数组广播的机制
Jul 12 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
php内嵌函数用法实例
2015/03/20 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
一个javascript参数的小问题
2008/03/02 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python素数检测实例分析
2015/06/15 Python
python计算圆周率pi的方法
2015/07/11 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
伦敦一卡通:The London Pass
2018/11/30 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
钳工实习自我鉴定
2013/09/19 职场文书
消防隐患整改通知书
2015/04/22 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js
Python 图片添加美颜效果
2022/04/28 Python