完美数

完美数(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位数,据估计它以四号字打出时需要一本字典大小的书。

推荐阅读:

点个好看

python判断是否为完全数_Python识别完美数相关推荐

  1. 软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全

    如果一个数恰好等于它的因子之和,则称该数为"完全数",又称完美数或完备数. 例如:第一个完全数是6,它有约数1.2.3.6,除去它本身6外,其余3个数相加, 1+2+3=6.第二个 ...

  2. python判断素数的函数_Python素数prime函数练习_Python源码实操

    Python素数prime函数练习_Python源码实操 素数prime函数练习 1) 写一个函数isprime(x) 判断x是否为素数,如果是素数,返回True,否则返回False def ispr ...

  3. python判断是不是文件夹_Python判断文件和文件夹是否存在的方法

    一.python判断文件和文件夹是否存在.创建文件夹 复制代码代码如下: >>> import os >>> os.path.exists("d:/ass ...

  4. python判断今天周几_Python如何根据日期判断周几

    python作为现在很流行的一门语言,学好python是很有必要的,下面是根据日期判断周几的个人总结的一些方法,可供参考. Python如何根据日期判断周几 Python判断周几主要使用了time, ...

  5. python判断密码是否正确_python密码判断是否符合要求的方法

    python中可以使用正则表达式来判断密码字符串是否符合要求.Python的re 模块提供字符正则匹配检查,功能强大,写法高效简洁,因此在工作中会被经常使用. python判断密码是否符合要求示例: ...

  6. python判断正负的函数_python判断正负数方式

    我就废话不多说了,大家还是直接看代码吧! a1 = raw_input("please input a number") a = int(a1) if(a!=0): if(a &g ...

  7. python判断字符类型编程_python判断字符类型怎么做

    设str为字符串 str.isalnum() 所有字符都是数字或字母(推荐学习:Python视频教程) str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 st ...

  8. python判断是否为数字符_Python判断字符串是否为数字

    Python判断一个字符串是否为数字,可以分为两种情况考虑. 字符为纯数字 如果需要检测的数字为纯数字,不包括负号,小数点等,可以使用字符串的isdigit()函数来判断 >>> a ...

  9. python判断一个数是否为回文数

    判断一个数是否为回文数(正向读和反向读结果一样) num = raw_input('请输入要判断是否为回文数的数:') if (num[::-1] == num[:]):       print '% ...

最新文章

  1. vs2015 + opencv3.4 配置
  2. ACM北大暑期课培训第六天
  3. LUA实现单词替换功能
  4. JS 新建web sql 数据表
  5. 安装Node.js和npm
  6. 企业网站 源码 e-mail_天津seo优化套餐服务收费_天津网站优化关键词价格
  7. 图论 —— 图的遍历
  8. 勒索软件好多都使用恶意LNK链接文件欺骗用户 来看趋势科技分析新型LNK-PowerShell攻击...
  9. aboutsqlserver.com:mvp
  10. IMAXB6充电器使用教程
  11. iOS端im实时音视频功能快速开发实操指导!
  12. 两年以后重读了一篇文章,写了点东西。
  13. 计算机组成原理(白中英) 第四章 课后题答案
  14. 红军协同对抗蓝军问题
  15. Facebook中国程序员之死:年仅38岁就跳楼轻生
  16. 计算机网络学习(一) 计算机网络概述
  17. 【C/C++】龙格库塔+亚当姆斯求解数值微分初值问题
  18. 在联网状态下,有很多网页或者应用无法联网问题,如360安全卫士, Smartscreen筛选器无法访问, 部分网页无法访问等问题的解决方法
  19. HDU1273漫步森林
  20. Day01JAVA入门

热门文章

  1. H5 中 bordercolorlight 属性的用法及作用
  2. java hibernate 插入数据_[Java教程]hibernate 返回新插入数据的Id
  3. Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)
  4. php switch goto,PHP goto语句用法实例
  5. 二级java考什么_计算机二级Java考试资料!
  6. HTML下拉菜单怎么做成横向,css导航条横向带下拉菜单
  7. excel文件导入hive乱码_将excel中的数据导入hive
  8. 计算机个性化定制服务课题,服务网络的构建与面向增量式需求的动态定制方法-计算机科学与技术专业论文.docx...
  9. 雅马哈php mt7,雅马哈专业录音室监听耳机 HPH-MT7 正式发售!
  10. git和gitlab安装