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中内置的日志模块logging用法详解
Jul 12 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
对python中的argv和argc使用详解
Dec 15 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
python属于跨平台语言码
Jun 09 Python
Python 数据的累加与统计的示例代码
Aug 03 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
Python  lambda匿名函数和三元运算符
Apr 19 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
降低PHP Redis内存占用
2017/03/23 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
JavaScript中的关联数组问题
2015/03/04 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
浅析PEP572: 海象运算符
2019/10/15 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
以下的初始化有什么区别
2013/12/16 面试题
new修饰符是起什么作用
2015/06/28 面试题
运动会800米加油稿
2014/02/22 职场文书
意向协议书范本
2014/04/23 职场文书
合作意向书
2014/07/30 职场文书
离职信范本
2015/06/23 职场文书
中学生运动会广播稿
2015/08/19 职场文书