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应用的教程
Apr 16 Python
Python实现配置文件备份的方法
Jul 30 Python
Python3.6正式版新特性预览
Dec 15 Python
python利用sklearn包编写决策树源代码
Dec 21 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
Django的性能优化实现解析
Jul 30 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
基于python实现删除指定文件类型
Jul 21 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python selenium 弹出框处理的实现
2019/02/26 Python
Python测试模块doctest使用解析
2019/08/10 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
百度JavaScript笔试题
2015/01/15 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
公司会计岗位职责
2014/02/13 职场文书
黄金酒广告词
2014/03/21 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
售后服务承诺函格式
2015/01/21 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书