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 命令行非阻塞输入的小例子
Sep 27 Python
python基础教程之基本内置数据类型介绍
Feb 20 Python
Python实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
python实现n个数中选出m个数的方法
Nov 13 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Python实现名片管理系统
Feb 14 Python
基于python实现删除指定文件类型
Jul 21 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
弹出模态框modal的实现方法及实例
2017/09/19 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
PyQt 线程类 QThread使用详解
2017/07/16 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
区分python中的进程与线程
2020/08/13 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
介绍下Lucene建立索引的过程
2016/03/02 面试题
家庭教育的心得体会
2014/09/01 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
催款函范文
2015/06/24 职场文书
行为习惯主题班会
2015/08/14 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
求职自我评价参考范文
2019/05/16 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
Python中的tkinter库简单案例详解
2022/01/22 Python
python如何读取和存储dict()与.json格式文件
2022/06/25 Python