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中dir函数用法分析
Apr 17 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
Python Logging 日志记录入门学习
Jun 02 Python
Python中的groupby分组功能的实例代码
Jul 11 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
python实现ping命令小程序
Dec 28 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
深入了解NumPy 高级索引
2020/07/24 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
入党群众意见范文
2015/06/02 职场文书
行政处罚决定书
2015/06/24 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python