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求斐波那契数列示例分享
Feb 14 Python
wxpython中利用线程防止假死的实现方法
Aug 11 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python3实现的字典遍历操作详解
Apr 18 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
python binascii 进制转换实例
Jun 12 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
python计算列表元素与乘积详情
Aug 05 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
用 JSON 处理缓存
2007/04/27 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Python Matplotlib库入门指南
2015/05/18 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python实现转圈打印矩阵
2019/03/02 Python
如何解决python多种版本冲突问题
2020/10/13 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
学校春季防火方案
2014/06/08 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
图书借阅制度范本
2015/08/06 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
vue判断按钮是否可以点击
2022/04/09 Vue.js