Python算法100例-3.3 阿姆斯特朗数

完整源代码项目地址,关注博主私信'源代码'后可获取

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.确定程序框架
  • 5.完整的程序
  • 6.问题拓展

1.问题描述

如果一个整数等于其各个数字的立方和,则该数称为“阿姆斯特朗数”(亦称为自恋性数)。如 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33,就是一个“阿姆斯特朗数”。试编程求1000以内的所有“阿姆斯特朗数”。

2.问题分析

“阿姆斯特朗数”与3.2节中的“水仙花数”的不同在于,前者并没有规定几位数,从两者的定义来看,“水仙花数”可以看作是“阿姆斯特朗数”的一个子集。对于这类问题的算法与“水仙花数”类似,需要把每一位分离出来,然后比较其立方和与原数是否相等。

3.算法设计

本题求的是1000以内满足条件的数,从数的位数来说可以分为一位数、两位数及三位数。这样可以根据数的位数不同分别求出不同范围内的“阿姆斯特朗数”,即一位数(1~9)、两位数(10~99)和三位数(100~999)分别用一个循环语句来实现。

上述方法有其局限性,如果题目改成求1 000 000以内甚至更大范围的话,程序里面会有多个循环,不但程序看起来烦琐,写起来也费事,更重要的是每个循环体做的事情都是一样的:将数的每一位拆分。对于这种重复的事情可以考虑用循环将其简化。对于一个数无论它的位数是多少,如果要将其拆分,要么按从低位到高位的顺序,要么按从高位到低位的顺序。本题按从低位到高位的顺序进行拆分。

从低位到高位进行拆分,每次拆分的都是当前数的个位,可以用当前数n对10求模,即n%10,这样最后一位就被分离出来;再次分离的是原数的次低位,对于次低位,要想办法让其成为新数的最低位,可采用原数n对10求商的方法,即n//10。其他位置的数据求法同上。

题目给出的数据最多三位,我们可以定义三个变量分别来存储原数的个位、十位和百位,也可以用数组来存储,数组的长度为3。

4.确定程序框架

程序流程图如图所示。

在这里插入图片描述

5.完整的程序

%%time
# 阿姆斯特朗数

if __name__ == "__main__":
    a = [0, 0, 0]                           # 列表a用来存储被拆分的数的个位、十位和百位
    print("1000以内的阿姆斯特朗数:")
    for i in range(2, 1000):
        t = 0
        k = i
        # 按从低位到高位的顺序拆分数
        while k:
            a[t] = k % 10
            k = k // 10
            t += 1
        sum = a[0]**3 + a[1]**3 + a[2]**3
        if i == sum:
            print("%d \t " %i, end="\n")

1000以内的阿姆斯特朗数:
153 	 
370 	 
371 	 
407 	 
CPU times: user 4.22 ms, sys: 31 µs, total: 4.25 ms
Wall time: 3.71 ms

6.问题拓展

本题程序采用的是从低位到高位的顺序进行分离。下面将从高位到低位顺序进行拆分的程序段给出,供读者参考。

%%time
# 阿姆斯特朗数

if __name__ == "__main__":
    a = [0, 0, 0]                           # 列表a用来存储被拆分的数的个位、十位和百位
    print("1000以内的阿姆斯特朗数:")
    for i in range(2, 1000):
        # 按从高位到低位的顺序拆分数
        t = 0
        k = 1000
        while k >= 10:
            a[t] = (i % k) // (k // 10)
            k = k // 10
            t += 1
        sum = a[0]**3 + a[1]**3 + a[2]**3
        if i == sum:                        # 判断是否为阿姆斯特朗数
            print("%d \t" %i, end="\n")

1000以内的阿姆斯特朗数:
153 	
370 	
371 	
407 	
CPU times: user 4.85 ms, sys: 324 µs, total: 5.18 ms
Wall time: 4.53 ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/425226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu20.04安装docker及运行

ubuntu20.04安装docker及运行 ubuntu环境版本 Ubuntu Focal 20.04 (LTS) 查看系统版本 rootubuntu20043:~# cat /proc/version Linux version 5.15.0-78-generic (builddlcy02-amd64-008) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, GNU ld (GNU Binutils for Ubuntu) …

JAVA *数据库连接池 * 接JDBC

一.介绍: 数据库连接池实际上就是一个 " 容器 " 当有多个拥护需要访问数据库的时候, 一个用户会打开一个数据库连接, 但是!当用户离开的时候,就会断开数据库连接,那么数据库连接就作废了,之后如果还有用户需要进行访问,需要再建立一个数据库连接......循环往复, …

(Linux学习四)用户权限介绍以及操作UGO(一)

用户提权 su永久提权: su - root //-加不加- 都可以 - 后面可以加变量 su root //su - root //切换root权限,需要输入密码 exit //登出 root 再次exit退出shellsudo 临时提权:部分特权语法:user MACHIN…

MySQL相关知识汇总

MySQL是一个广泛使用的开源关系型数据库管理系统,它以其高性能、稳定性和易用性而备受开发者喜爱。在软件开发领域,无论是大型项目还是小型应用,MySQL都扮演着重要的角色。本文将对MySQL的一些关键知识点进行汇总,帮助读者更好地了…

type-alisaea-package

type-alisaea-package : 是自动配置别名,也就是设置这个之后,在Mybatis的Mapper文件里就可以写对应的类名,而不用写全路径名了 ; 作用 : 简化xml文件中resultType中指定路径配置 ; 如何配置 : 在springboot项目中的application.yaml文…

【网站项目】219一中体育馆管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

EasyRecovery16电脑硬盘数据恢复软件功能详解

在数字化时代,人们在日常生活和工作中越来越依赖于电脑和移动设备。不管是个人用户还是企业,数据的重要性都不言而喻。然而,数据丢失和损坏的风险也随之增加,因此,数据恢复软件的需求也日益增长。 EasyRecovery 16是一…

transformer--编码器2(前馈全连接层、规范化层、子层链接结构、编码器层、编码器)

前馈全连接层 什么是前馈全连接层: 在Transformer中前馈全连接层就是具有两层线性层的全连接网络 前馈全连接层的作用: 考虑注意力机制可能对复杂过程的拟合程度不够,通过增加两层网络来增强模型的能力 code # 前馈全连接层 class PositionwiseFeedForward(nn.Module):de…

电机的极数和槽数,机械角度和电角度,霍尔IC,内外转子

什么是电机的极数和槽数? 【第7集】② 正弦波驱动的转矩脉动、正弦电流的时序和相位变化、超前角控制(超前角调整)、正弦波驱动的各种波形 - 电源设计电子电路基础电源技术信息网站_罗姆电源设计R课堂 (rohm.com.cn) 下面为您介绍表示电机…

[计算机网络]--I/O多路转接之poll和epoll

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、poll函…

前端开发中的浏览器兼容性问题及解决方案

前言 在之前的文章中,我们学习了前端开发中的网站性能提升的相关内容。在本文中,我们将深入探讨一个前端开发者必须面对的问题:浏览器兼容性问题。我们将介绍什么是浏览器兼容性问题,为什么会发生这种问题,以及如何解决…

ArrayBlockingQueue 数组阻塞队列 源码阅读

1. 概述 数组阻塞队列 有界的阻塞数组, 容量一旦创建, 无法修改阻塞队列, 队列满的时候, 往队列put数据会被阻塞, 队列空, 取数据也会被阻塞并发安全 2. 数据结构 /** 存储队列元素的数组 */ /** 存储队列元素的数组 */ final Object[] items;/** 队首位置,下一…

D2BNet

task-specific contextual information {M l _l l​} that we split into { M l m , M l a M_l^m,M_l^a Mlm​,Mla​} 辅助信息 作者未提供代码

基于Spring Boot+Vue的旅游网站

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

Fastwhisper + Pyannote 实现 ASR + 说话者识别

文章目录 前言一、faster-whisper简单介绍二、pyannote.audio介绍三、faster-whisper pyannote.audio 实现语者识别四、多说几句 前言 最近在研究ASR相关的业务,也是调研了不少模型,踩了不少坑,ASR这块,目前中文普通话效果最好的…

ASM处理字节码流程

ASM处理字节码流程 ASM是一个操作Java字节码类库,其操作的对象是字节码数据,处理字节码方式是“拆分-修改-合并”。 将.class文件拆分成多个部分 对某一个部分的信息进行修改 将多个部分重新组织成一个新的class文件

机器学习-4

文章目录 前言数组创建切片索引索引遍历切片编程练习 总结 前言 本篇将介绍数据处理 Numpy 库的一些基本使用技巧,主要内容包括 Numpy 数组的创建、切片与索引、基本运算、堆叠等等。 数组创建 在 Python 中创建数组有许多的方法,这里我们使用 Numpy 中…

校企合作项目总结

校企合作总结 前言项目框架开发待办水平越权总结 前言 寒假里小组给了校企合作的项目,分配给我的工作量总共也就两三套crud,虽然工作很少,但还是从里面学到了很多东西,收获了大量的实习经验,在这里总结记录一下。 项…

LLM@本地大语言模型@Gemma的安装与使用@dockerDesktop的安装和启动

文章目录 准备refsollama安装过程2b模型的效果小结👺 ollama的进一步使用帮助文档查看ollama安装了哪些模型使用皮肤来使聊天更易用 使用Chatbot UI皮肤安装docker👺启动docker载入和退出dockerchatbot 网页版皮肤 使用命令行聊天小结👺 准备…

vulhub中JBoss 4.x JBossMQ JMS 反序列化漏洞复现(CVE-2017-7504)

Red Hat JBoss Application Server(AS,也称WildFly)是美国红帽(Red Hat)公司的一款基于JavaEE的开源的应用服务器,它具有启动超快、轻量、模块化设计、热部署和并行部署、简洁管理、域管理及第一类元件等特…