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通过floor函数舍弃小数位的方法
Mar 17 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
python如何实现内容写在图片上
Mar 23 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
python实现键盘控制鼠标移动
Nov 27 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
Python如何将字符串转换为日期
Jul 31 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
那些年一起学习的PHP(一)
2012/03/21 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
js文字横向滚动特效
2015/11/11 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
python 检查文件mime类型的方法
2018/12/08 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
辅导员评语
2014/05/04 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android