python判断是否为完全数_Python识别完美数

完美数

完美数(perfect number,又称完全数)指,它所有的真因子(即除了自身以外的因子)和,恰好等于它自身。

第一个完美数:6,

第二个完美数:28,

第三个完美数:496,

第四个完美数:8128,

第五个完美数:33550336,

.......

2 探索

在茫茫数海中,第五个完美数(33550336)要大得多,居然藏在千万位数的深处!它在十五世纪被人们发现,计算机问世后,借助这一有力工具,数论爱好者们继续探索。

笛卡尔曾公开预言:“能找出的完美数是不会多的,好比人类一样,要找一个完美人亦非易事。”

时至今日,人们一直没有发现有奇完美数的存在。于是是否存在奇完美数成为数论中的一大难题。只知道即便有,这个数也是非常之大,并且需要满足一系列苛刻的条件。

经过不少数学家研究,到2013年为止,一共找到了48个完美数。

3 有趣性质

1. 目前发现的完美数都是以6或8结尾,会不会有奇完全数存在?如果存在,它必须大于10^300,至今无人能回答这些问题。

2. 所有的完美数都是三角形数。例如:6=1+2+3

28=1+2+3+...+6+7

8128=1+2+3…+126+127

3. 所有完美数的倒数都是调和数。例如:1/1+1/2+1/3+1/6=2

1/1+1/2+1/4+1/7+1/14+1/28=2

1/1+1/2+1/4+1/8+1/16+1/31+1/62+1/124+1/248+1/496=2

4. 可以表示成连续奇立方数之和。除6以外的完全数,都可以表示成连续奇立方数之和,并规律式增加。例如:28=1³+3^3

496=1^3+3^3+5^3+7^3

8128=1^3+3^3+5^3+……+15^3

33550336=1^3+3^3+5^3+……+125^3+127^3

4 判断

如何判断是为否完美数呢?在计算机数值型可以表达的的范围内,我们可以尝试找一找。

这是一道leetcode题(No.507),我前段时间写过一个解,在leetcode平台上已通过:class Solution:

def checkPerfectNumber(self, num: int) -> bool:

sum = 1

tmp = num

if num == 0 or num==1:

return False

while num%2 == 0:

num /= 2

sum += num+tmp/num

return sum==tmp

已知完美数都以6或8结尾,所以才有了上面的方法,注意这不是寻找一个数所有因子的方法。使用6或8结尾这个小trick,实现更高效( > 95.26%),但不严谨。

很遗憾,今天我发现这是一个错误的解法,虽然在Leetcode上已经通过。原因如下,我们试图打印尽可能多的完美数:import sys

if __name__ == "__main__":

s = Solution()

i,j = 0,0

while(i

isPerfect = s.checkPerfectNumber(i)

if isPerfect is True:

j+=1

print("第%d个完美数: %d"%(j,i))

i+=1

第1个完美数: 6

第2个完美数: 28

第3个完美数: 120

第4个完美数: 496

第5个完美数: 2016

第6个完美数: 8128

第7个完美数: 32640

第8个完美数: 130816

第9个完美数: 523776

第10个完美数: 2096128

很明显,120不是一个完美数,因此,可以确定Leetcode平台遗漏了这些cases,已经将此问题提交到Leetocode,如下所示:

5 正解

如果遍历所有的小于num的数,check是否为其因子,时间复杂度为o(n),在平台上提交会超时。

一种更好的解法,时间复杂度为O(sqrt(n)), 因为num的两个因子:num_i和num_j,假设num_i < num_j ,则 num_i 的最大值为 sqrt(num), 所以我们只需要遍历到sqrt(num)即可。

代码如下:class Solution:

def checkPerfectNumber(self, num: int) -> bool:

if num <= 0:

return False

i, sum = 1, 0

while i*i <= num:

if num % i == 0:

sum += i

if i*i != num:

sum += num / i

i += 1

return sum - num == num

6 更多完美数

6. 8,589,869,056

7. 137,438,691,328

8. 2,305,843,008,139,952,128

9. 2,658,455,991,569,831,744,654,692,615,953,842,176

10. 191,561,942,608,236,107,294,793,378,084,303,638,130,997,321,548,169,216

11. 13,164,036,458,569,648,337,239,753,460,458,722,910,223,472,318,386,943,117,783,728,128

12. 14,474,011,154,664,524,427,946,373,126,085,988,481,573,677,491,474,835,889,066,354,349,131,199,152,128

……

……

47 ……2^42643800 X (2^42643801-1)

48 ……2^57885160 X (2^57885161-1)

由于后面数字位数较多,例子只列到12个,第13个有314位。

到第39个完全数有25674127位数,据估计它以四号字打出时需要一本字典大小的书。

推荐阅读:

点个好看

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

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

相关文章

linux嵌入式做智能家居,嵌入式系统在智能家居中的应用

汪家乐利用嵌入式系统来构建智能家居系统&#xff0c;使得用户可以根据实际需求来进行操作&#xff0c;不仅可以提高生活水平&#xff0c;并且与其他系统相比&#xff0c;其在运行上具有更高的稳定性。本文对嵌入式系统在智能家居中应用要点进行了简单分析。【关键词】嵌入式系…

前端路由的两种实现原理

2019独角兽企业重金招聘Python工程师标准>>> History API 这里不细说每一个 API 的用法&#xff0c;大家可以看 MDN 的文档&#xff1a;https://developer.mozilla.org... 重点说其中的两个新增的API history.pushState 和 history.replaceState 这两个 API 都接收三…

2.JAVA简史

SUN公司 --美国SUN&#xff08;Stanford university network&#xff09;公司 --在中国大陆的正式中文名&#xff1a;太阳计算机系统&#xff08;中国&#xff09;有限公司 --在中国台湾中文名&#xff1a;升阳电脑公司 JAVA为什么被发明&#xff1f; --是sun公司Green项目…

es统计有多少个分组_ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)

1 普通聚合分析1.1 直接聚合统计(1) 计算每个tag下的文档数量, 请求语法:GET book_shop/it_book/_search{"size": 0, // 不显示命中(hits)的所有文档信息"aggs": {"group_by_tags": {// 聚合结果的名称, 需要自定义(复制时请去掉此注释)"te…

python程序运行原理_谈谈 Python 程序的运行原理

因为我的个人网站 restran.net 已经启用&#xff0c;博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容&#xff0c;谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的读书笔记&#xff0c;整理完之后才发现很长&#xff0c;那就将就看吧。…

3.JDK和JRE和JVM的区别

JDK --Java Development Kit --java 开发工具包 JRE --Java Runtime Environment --java运行时环境 JVM --Java Virtual Machine --java虚拟机 ------------- 更多的Java&#xff0c;Angular&#xff0c;Android&#xff0c;大数据&#xff0c;J2EE&#xff0c;Python…

缓存cache

由于Django是动态网站&#xff0c;所有每次请求均会去数据进行相应的操作&#xff0c;当程序访问量大时&#xff0c;耗时必然会更加明显&#xff0c;最简单解决方式是使用&#xff1a;缓存&#xff0c;缓存将一个某个views的返回值保存至内存或者memcache中&#xff0c;5分钟内…

微信小程序 等待几秒、_微信小程序—setTimeout定时器的坑

背景实验室需要将项目的app搬到微信的小程序上&#xff0c;终于知道为什么程序员是手艺人了&#xff0c;只要有需求&#xff0c;就要想方设法去填充这种需求&#xff0c;去年是小程序的元年了可以说&#xff0c;去年冬天一个叫跳一跳的小程序游戏出现在我的微信中&#xff0c;当…

linux中断处理模式,Linux在保护模式下的中断处理分析.pdf

Linux在保护模式下的中断处理分析.pdfLinux 在保护模式下的中断处理分析刘万里 杨 斌(西南交通大学计算机与通信工程学院&#xff0c;成都 610031)E-mail&#xff1a;awan摘 要 该文以 80x86 保护模式下的中断处理方法为基础&#xff0c;针对 Linux 在实时嵌入式系统中的具体应…

python3.7是什么_Python 3.7 有什么新变化

idlelib 与 IDLE 多个对自动补全的修正。 &#xff08;由 Louie Lu 在 bpo-15786 中贡献。&#xff09; Module Browser (在 File 菜单中&#xff0c;之前称为 Class Browser) 现在会在最高层级函数和类之外显示嵌套的函数和类。 &#xff08;由 Guilherme Polo, Cheryl Sabell…

4.JVM简述

JVM是一种规范。 就是一个虚拟的用于执行bytecodes字节码的计算机 可以用软件来实现&#xff0c;如IBM,SUN,BEA等按照这个规范实现&#xff0c;可以实现比SUN公司更好的JVM&#xff0c;我们自己也可以实现一个。 可以使用硬件来实现&#xff0c;如sun与intel公司研发java的芯…

python ssh shell交互_使用Paramiko在Python上用ssh实现交互式shell?

我想编写一个程序(在Windows 7上的Python 3.x中),它通过ssh在远程shell上执行多个命令.在查看paramikos的exec_command()函数之后,我意识到它不适合我的用例(因为在执行命令后通道被关闭),因为命令依赖于环境变量(由先前的命令设置)并且不能连接到一个exec_command()调用,因为它…

linux7如何进入紧急模式,CentOS7开机进入紧急模式EmergencyMode的解决办法

iOS Runtime学习笔记Associated Objects: interface NSObject (AssociatedObject) property (nonatomic, strong) id associat ...Vim&#xff0c;极简使用教程&#xff0c;让你瞬间脱离键鼠切换的痛苦注:看大家对Vim仇恨极大,其实它只是一种文本操作方式,可以减少键鼠的切换,从…

用pycharm写python_如何利用pyCharm编写和运行python文件

在安装python环境后&#xff0c;通常可以利用IDE pyCharm来编译我们的python文件。创建一个python文件夹&#xff0c;用pyCharm打开文件夹&#xff0c;在文件夹中新建一个python文件demo.py 也许你知道用cmd中的python指令 python demo.py去运行这个文件&#xff0c;但是如何在…

5.JDK环境配置

下载 进入Oracle官网下载&#xff0c;点击进入 安装 一路下一步。记住安装到哪里了。 配置环境变量 JAVA_HOME 刚才的java安装目录 PATH %JAVA_HOME%\bin PATH里配置多个用英文的分号; 分隔。 *classpath&#xff0c;jdk5.0以上可以不用配置了 测试 windows下&#xf…

GBK 编码

GBK编码范围&#xff1a;8140&#xff0d;FEFE&#xff0c;汉字编码范围见第二节&#xff1a;码位分配及顺序。 GBK编码&#xff0c;是对GB2312编码的扩展&#xff0c;因此完全兼容GB2312-80标准。GBK编码依然采用双字节编码方案&#xff0c;其编码范围&#xff1a;8140&#x…

less webpack 热更新_webpack---less+热更新 使用

最近尝试用less写界面,webpack进行打包&#xff0c;然后发现每次修改less时都需要重新执行webpack打包一下&#xff0c;于是就想到了webpack热更新这个功能。一、使用lessless是一门css预处理语言&#xff0c;它是拓展了css&#xff0c;增加了变量&#xff0c;Mixin等等。使用l…

6.第一个程序Hello World

新建文件夹 在C盘新建个文件夹 mycode。注意不要用中文。 新建java文件 1、显示隐藏文件名。 2、右键新建文本文件 3、重命名为 Welcome.java。&#xff08;首字母必须大写。如果不显示隐藏文件名&#xff0c;会是Welcome.java.txt不是java文件&#xff09; 4、编写代码 p…

pythonstdin_python 笔试输入:sys.stdin.readline和input

①&#xff1a;输入一行数据并输 出两种方法 # 输入一行数据并输出 import sys # 方法一&#xff1a; str1 input() print(input 输入:,str1,len,len(str1)) print(循环遍历输入得到输入的每个字符的ascii码如下&#xff1a;) for i in str1: print(ord(i)) # 方法二&#xff…

c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

C语言中动态分配二维数组复习过程.docC语言中动态分配二维数组在C中动态分配内存的&#xff0c;对于单个变量&#xff0c;字符串&#xff0c;一维数组等&#xff0c;都是很容易的。C中动态分配二维数组的方法&#xff0c;很少有C语言书中描述&#xff0c;我查找了有的C语言书中…