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实现通过shelve修改对象实例
Sep 26 Python
python实现指定字符串补全空格的方法
Apr 30 Python
详解Python的Lambda函数与排序
Oct 25 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
python实现推箱子游戏
Mar 25 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
使用Django清空数据库并重新生成
Apr 03 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Django框架安装及项目创建过程解析
Sep 14 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python中__init__和__new__的区别详解
2014/07/09 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
外语系大学生自荐信范文
2014/03/01 职场文书
宿舍标语大全
2014/06/19 职场文书
新闻学专业求职信
2014/07/28 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python