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 Web开发模板引擎优缺点总结
May 06 Python
Python的Django框架使用入门指引
Apr 15 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
Python内置函数OCT详解
Nov 09 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
通过python实现弹窗广告拦截过程详解
Jul 10 Python
pytorch forward两个参数实例
Jan 17 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
python如何建立全零数组
Jul 19 Python
Python办公自动化解决world文件批量转换
Sep 15 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
PHP中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
Destoon模板制作简明教程
2014/06/20 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
PHP中header用法小结
2016/05/23 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
js DOM模型操作
2009/12/28 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
xml转json的js代码
2012/08/28 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
python encode和decode的妙用
2009/09/02 Python
python中列表元素连接方法join用法实例
2015/04/07 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python实现随机漫步功能
2018/07/09 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
2014年两会学习心得体会
2014/03/17 职场文书
聘任书模板
2014/03/29 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
部队2014年终工作总结
2014/11/27 职场文书
网吧温馨提示
2015/07/17 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
浅析Python中的套接字编程
2021/06/22 Python