Python算法100例-3.4 完数

news2024/9/29 1:21:56

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

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

1.问题描述

求某一范围内完数的个数。

如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。

2.问题分析

根据完数的定义,解决本题的关键是计算出所选取整数i(i的取值范围不固定)的因子(因子就是所有可以整除这个数的数),然后将各因子累加到变量s(记录所有因子之和),若s等于i,则可确认i为完数,反之则不是完数。

3.算法设计

对于这类求某一范围(本题范围不固定,在编程过程中采用键盘输入的方式)内满足条件的数的问题,一般采用遍历的方式,即一个一个地去判断给定范围内的数值是否满足条件,这一过程可利用循环来实现。

本题的关键是求出选取数值i的因子,即从1到i-1范围内能整除i的数。看某一个数j是不是i的因子,可利用语句“if i%j==0”进行判断,求某一个数的所有因子,需要在1到i-1范围内进行遍历,同样采用循环实现。因此,本题从整体上看可利用两层循环来实现。外层循环控制该数的范围为2~n;内层循环j控制除数的范围为1~i,通过判断i对j取余是否等于0,找到该数的各个因子。程序段如下:

i = 2                                                   # 变量 i 控制选定数的范围
while i <= n:
     ...
     for j in range(i):
         ...

     if s == i:                             # 判断因子之和是否和原数相等
        # 输出当前i是完数
     i += 1


对于某个选定的数,将求得的各因子累加到变量s(累加过程中用到s的初值,故s初值为0)之后,s的值发生改变,若直接将下一个选定数的因子加到s上,得到的值并非所求(此时s的初值不是0而是上一个选定数的因子之和)。因此每次判断下一个选定数之前,必须将变量s的值重新置为0。编程过程中一定要注意变量s重新置0的位置,如果语句放的位置不正确,得到的结果也不是正确结果。

注意:

  Python语言中的整数问题经常涉及判断两个数是否相等或某变量(或表达式)是否满足某一条件的情况,对于这类问题,初学者经常会出现混用赋值符号“=”与等于号“==”的情况。

   赋值符号“=”的优先级别低于其他的运算符,所以对该运算符往往最后读取。它的作用是将一个表达式的值赋给一个变量(左值)。左值必须能够被修改,不能是常量。如while i=10的作用是将右值“10”赋给左值i,每次判断i的值都为10,故表达式的值为非0,即判定条件为真,导致程序进入死循环。

  等于号“”是关系运算符的一种,结果只有True或False两种。它的作用是用来判断等号“”两边参与运算的值是否相等,若相等,则返回True,否则返回False。如while i==10的作用是判断变量i的值是否等于10,若相等,表达式的值为True,否则为False,当表达式为真,程序继续执行循环体语句,否则结束循环。

4.确定程序框架

程序流程图如图所示。

在这里插入图片描述

5.完整的程序

%%time
# 完数

if __name__=="__main__":
    n = int(input("请输入所选范围上限: "))
    print(f'输入的范围上限:{n}')
    i = 2                                           # 变量 i 控制选定数的范围
    while i <= n:
        s = 0                                       # s记录累加因子之和,保证每次循环时s的初值为0
        j = 1                                       # j 控制除数范围
        for j in range(i):
            if j != 0 and i % j == 0:       # 判断 j 是不是 i 的因子
                s += j                                      # 因子和

        if s == i:                                          # 判断因子之和是否和原数相等
            print("2到%d之间的完数:%d" %(n, i))
        i += 1


输入的范围上限:10000
2到10000之间的完数:6
2到10000之间的完数:28
2到10000之间的完数:496
2到10000之间的完数:8128
CPU times: user 8.92 s, sys: 10.4 ms, total: 8.93 s
Wall time: 11.8 s

6.问题拓展

上述程序中,求某数的因子时采用从1到i-1范围内进行遍历的方法,一个数一个数地去试。这种方法可以做到没有遗漏,但是效率不高。

对于某一整数来说,其最大因子为n/2(此时n为偶数,若n为奇数,其最大因子小于n/2),在n/2~n-1范围内没有数据可以整除此数。据此,我们可以把遍历范围缩小至1~n-1,这样程序效率可以提高一倍。相应的程序如下:

%%time
# 完数

if __name__=="__main__":
    n = int(input("请输入所选范围上限: "))
    i = 2  # 变量 i 控制选定数范围
    print(n)
    while i <= n:
        s = 0  # s记录累加因子之和,保证每次循环时s的初值为0
        j = 1  # j 控制除数范围
        while j <= (i//2):
            if j != 0 and i % j == 0:  # 判断 j 是不是 i 的因子
                s += j  # 因子和
            j += 1

        if s == i:  # 判断因子之和是否和原数相等
            print("2到%d之间的完数:%d" %(n, i))
        i += 1



10000
2到10000之间的完数:6
2到10000之间的完数:28
2到10000之间的完数:496
2到10000之间的完数:8128
CPU times: user 8.47 s, sys: 5.87 ms, total: 8.47 s
Wall time: 11.1 s

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#中多语言编程原理及实例解析

文章目录 一、了解C#多语言编程原理1. 通用语言运行库&#xff08;CLR&#xff09;2. 通用类型系统&#xff08;CTS&#xff09;3. 微软中间语言&#xff08;MSIL&#xff09;4. 元数据和反射5. 公共语言规范&#xff08;CLS&#xff09; 二、实例说明 一、了解C#多语言编程原理…

Linux笔记--用户与用户组

Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员(root)申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系…

MIT-BEVFusion系列九--CUDA-BEVFusion部署6 前向推理的数据加载与图像预处理

目录 加载图像数据加载点云数据模型推理并计时预热操作模型推理检查点云输入数据量打印信息中CopyLidar部分的计算和耗时打印信息中ImageNrom图像预处理部分计算和耗时 该系列文章与qwe、Dorothea一同创作&#xff0c;喜欢的话不妨点个赞。 接上面的文章&#xff0c;目光聚焦回…

为啥要用C艹不用C?

在很多时候&#xff0c;有人会有这样的疑问 ——为什么要用C&#xff1f;C相对于C优势是什么&#xff1f; 最近两年一直在做Linux应用&#xff0c;能明显的感受到C带来到帮助以及快感 之前&#xff0c;我在文章里面提到环形队列 C语言&#xff0c;环形队列 环形队列到底是怎么回…

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…

ElasticSearch相关知识点

ElasticSearch相关知识点 1.了解ES ES的作用&#xff1a;ES是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 ELK技术栈&#xff1a;ES结合kibana、Logstash、Beasts&#xff0c;也就是 elastic stack 。…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

小白必看的Python函数讲解

定义函数 我们通过斐波那契数列来理解定义函数 >>> def fib(n): # 将斐波那契数列打印到 n ... """将斐波那契数列打印到 n""" ... a, b 0, 1 ... while a < n: ... print(a, end ) ... a, b b, …

IPC资源在linux内核中如何管理

1.先看各个通信的接口 1.共享内存接口 2.消息队列接口 3.信号量接口 2.管理他们的结构体&#xff1a; 其实管理他们的是一个数组&#xff0c;和open返回的fd差不多&#xff0c;shmid&#xff0c;msqid,semid的大小都是这个数组的下标。那数组的结构是什么呢&#xff1f; 然后…

hive中spark SQL做算子引擎,PG作为MetaDatabase

简介 hive架构原理 1.客户端可以采用jdbc的方式访问hive 2.客户端将编写好的HQL语句提交&#xff0c;经过SQL解析器&#xff0c;编译器&#xff0c;优化器&#xff0c;执行器执行任务。hive的存算都依赖于hadoop框架&#xff0c;所依赖的真实数据存放在hdfs中&#xff0c;解析…

JCL中IEFBR14和COND

JCL中IEFBR14和COND ​ COND CODE&#xff0c;就是反映JCL中STEP运行状态的参数&#xff0c;JCL正常终了的COND CODE 是0000&#xff0c;另外笔者在执行某些工具JCL时候&#xff0c;比方说简单一个COMPARE吧&#xff0c;可能会出现0012、0004或者0016&#xff0c;0001&#xf…

【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)

字符流练习 练习1&#xff1a;文件夹拷贝1.1 需求1.2 代码实现1.3 输出结果 练习2&#xff1a;文件加密与解密2.1 需求2.2 代码实现2.3 输出结果 练习3&#xff1a;修改文件数据&#xff08;常规方法&#xff09;3.1 需求3.2 代码实现3.3 输出结果 练习4&#xff1a;修改文件数…

Sqli-labs靶场第19关详解[Sqli-labs-less-19]自动化注入-SQLmap工具注入

Sqli-labs-Less-19 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了Referer &#xff0c;设想如果在Referer 尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…

javaEE--后端环境变量配置

目录 pre 文件准备 最终运行成功结果 后端运行步骤 1.修改setenv文件 2.运行setenv&#xff0c;设置环境变量 3.查看jdk版本 4.修改mysql文件夹下的my文件 前端运行步骤 1.nodejs环境配置 2.查看node和npm版本 3.下载并运行npm 4.注册登录 pre 文件准备 最终运行…

c++基础学习第一天

c基础学习第一天 文章目录 1、C初识1.1、注释1.2、变量1.3、常量1.4、关键字1.5、标识符命名规则 2、数据类型2.1、整型2.2、sizeof关键字2.3、实型&#xff08;浮点型&#xff09;2.4、字符型2.5、转义字符2.6、字符串型2.7、布尔类型bool2.8、数据的输入 3、运算符3.1、算术运…

黑马点评-短信登录业务

原理 模型如下 nginx nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡到下游tomcat服务器&#xff0c;打散流量。 我们都知道一台4核8G的tomca…

低密度奇偶校验码LDPC(八)——QC-LDPC译码器FPGA设计概要

往期博文 低密度奇偶校验码LDPC&#xff08;一&#xff09;——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC&#xff08;二&#xff09;——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC&#xff08;三&#xff09;——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

循序渐进丨MogDB / openGauss 的三种函数稳定性关键字

一、Oracle 中类似的函数稳定性关键字&#xff08;DETERMINISTIC&#xff09; 在 Oracle 里&#xff0c;function有着一个DETERMINISTIC参数&#xff0c;它表示一个函数在输入不变的情况下输出是否确定&#xff0c;只要输入的参数一样&#xff0c;返回的结果一定是一样的&#…

挑选适合您企业的2024年人力资源管理软件:完整指南

今日给您盘点的热门人力资源管理软件有&#xff1a;Zoho People&#xff0c;SAP ERP HCM&#xff0c;Workday&#xff0c;Oracle HCM Cloud。 Zoho People 人力资源管理系统 Zoho People是一款由Zoho公司开发的人力资源管理软件&#xff0c;旨在从集中位置管理和访问所有员工数…

Sqli-labs靶场第20关详解[Sqli-labs-less-20]自动化注入-SQLmap工具注入

Sqli-labs-Less-20 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 登录后会有记录 Cookie 值 设想如果在Cookie尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…