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实现百度关键词排名查询
Mar 30 Python
python WindowsError的错误代码详解
Jul 23 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
python实现在线翻译功能
Mar 03 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
python使用建议与技巧分享(二)
Aug 17 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
基于tensorflow权重文件的解读
May 26 Python
Python中的xlrd模块使用整理
Jun 15 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
php基础知识:类与对象(5) static
2006/12/13 PHP
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
php5与php7的区别点总结
2019/10/11 PHP
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
js的写法基础分析
2011/01/17 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
jquery编写日期选择器
2017/03/16 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
浅谈python中的占位符
2017/11/09 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
讲文明知礼仪演讲稿
2014/09/13 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers