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实现单链表的方法示例
Sep 03 Python
超实用的 30 段 Python 案例
Oct 10 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
Series和DataFrame使用简单入门
Nov 13 Python
python中必要的名词解释
Nov 20 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
如何在 Django 模板中输出 "{{"
Jan 24 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
You might like
处理php自动反斜杠的函数代码
2010/01/05 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
9种改善AngularJS性能的方法
2017/11/28 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
复制粘贴功能的Python程序
2008/04/04 Python
Python编码时应该注意的几个情况
2013/03/04 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
python高阶爬虫实战分析
2018/07/29 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
如何进行Linux分区优化
2013/02/12 面试题
工厂门卫岗位职责范本
2014/04/04 职场文书
企业安全生产承诺书
2014/05/22 职场文书
企业读书活动总结
2014/06/30 职场文书
党校毕业心得体会
2014/09/13 职场文书
物业保安辞职信
2015/05/12 职场文书
百年孤独读书笔记
2015/06/29 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书