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 判断数字是否小于0的方法详解
Jan 26 Python
django认证系统 Authentication使用详解
Jul 22 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
详解python pandas 分组统计的方法
Jul 30 Python
详解python中docx库的安装过程
Nov 08 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
appium+python adb常用命令分享
Mar 06 Python
Python基于pandas爬取网页表格数据
May 11 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
python Pexpect模块的使用
Dec 25 Python
实例详解Python的进程,线程和协程
Mar 13 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
php垃圾代码优化操作代码
2010/08/05 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
js控制input输入字符解析
2013/12/27 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
js模拟微博发布消息
2017/02/23 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
自考生自我评价分享
2014/01/18 职场文书
科研先进个人典型材料
2014/01/31 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
公路绿化方案
2014/05/12 职场文书
电力培训心得体会
2014/09/02 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android