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的高级Git库 Gittle
Sep 22 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Django实战之用户认证(初始配置)
Jul 16 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
django删除表重建的实现方法
Aug 28 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
python 写一个文件分发小程序
Dec 05 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
多重?l件?合查?(二)
2006/10/09 PHP
PHP 字符串 小常识
2009/06/05 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
py中的目录与文件判别代码
2008/07/16 Python
常见python正则用法的简单实例
2016/06/21 Python
python决策树之CART分类回归树详解
2017/12/20 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
Python内存映射文件读写方式
2020/04/24 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
python能做哪些生活有趣的事情
2020/09/09 Python
电子商务个人自荐信
2013/12/12 职场文书
同事打架检讨书
2014/02/04 职场文书
代领毕业证委托书
2014/08/02 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
事业单位聘任报告
2015/03/02 职场文书
保护地球的宣传语
2015/07/13 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电