前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python识别完美数

Python识别完美数

作者头像
double
发布于 2019-07-01 07:45:26
发布于 2019-07-01 07:45:26
2.6K10
代码可运行
举报
文章被收录于专栏:算法channel算法channel
运行总次数:0
代码可运行

完美数

完美数(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平台上已通过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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上已经通过。原因如下,我们试图打印尽可能多的完美数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys

if __name__ == "__main__":
    s = Solution()
    i,j = 0,0
    while(i<sys.maxsize):
        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)即可。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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位数,据估计它以四号字打出时需要一本字典大小的书。

推荐阅读:

如何拿下10个算法工程师offer,不可错过!

Python数据分析学习路线个人总结

面经:L1和L2正则

点个好看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
怎么联系你
怎么联系你
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
TienChin 活动管理-添加活动页面
直接将原有的 index.vue 的全部内容替换成下面的,这里先替换,我只是补齐文档,后面新模块开发我会一步一步进行记录起来:
程序员NEO
2023/10/12
6650
猿实战08——属性库实现之属性关系绑定
属性和属性值,看上去很不起眼,数据粒度也很小,但是正式因为数据粒度小,灵活多变,组织得当可以强有力的区分千变万化的商品。
山旮旯的胖子
2020/09/05
8800
猿实战08——属性库实现之属性关系绑定
TienChin 活动管理-活动列表展示
程序员NEO
2023/10/12
5510
TienChin 活动管理-活动列表展示
vue2.0+Element-ui实战案例
我们将会选择使用一些 vue 周边的库vue-cli, vue-router,axios,moment,Element-ui搭建一个前端项目案例,后端数据接口,会使用json-server快速搭建一个本地的服务,方便对数据的增删改查,
小周sir
2019/09/23
2.3K0
vue2.0+Element-ui实战案例
基于HTML+CSS+JavaScript角色后台管理系统设计毕业论文源码
✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (110套) 】 🌎超炫酷的Echarts大屏可视化源码:【🔰 echarts大屏展示大数据平台可视化(150套) 】 🎁 免费且实用的WEB前端学习指南: 【📂web前端零基础到高级学习视频教程 120G干货分享】 🥇 关于作者: 历任研发工程师
IT司马青衫
2022/08/16
1.2K0
基于HTML+CSS+JavaScript角色后台管理系统设计毕业论文源码
ElementUI Dialog 对话框,组件之间传值
Dialog 组件的内容可以是任意的,甚至可以是表格或表单,下面是应用了 Element Table 和 Form 组件的两个样例。
py3study
2021/01/29
4.9K0
手把手教你实现一个Vue无限级联树形表格(增删改)
平时我们可能在做项目时,会遇到一个业务逻辑。实现一个无限级联树形表格,什么叫做无限级联树形表格呢?就是下图所展示的内容,有一个祖元素,然后下面可能有很多子孙元素,你可以实现添加、编辑、删除这样几个功能。
马克社区
2022/05/11
1.6K0
el-table 多表格弹窗嵌套数据显示异常错乱问题
使用vue+element开发报表功能时,需要列表上某列的超链接按钮弹窗展示,在弹窗的el-table列表某列中再次使用超链接按钮点开弹窗,以此类推多表格弹窗嵌套,本文以弹窗两次为例 最终效果如下示例页面
GoodTime
2024/03/05
3230
el-table 多表格弹窗嵌套数据显示异常错乱问题
vue的修饰符!sync和el-dialog弹窗组件
父组件 index.vue: <template> <info :value="myValue" @valueChanged="e => myValue = e"></info> </template> <script> inport info from './info.vue'; export default { components: { info, }, data() { return {
leader755
2022/03/09
7830
微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
创建 src/views/core/borrow-info/detail.vue 
一个风轻云淡
2022/11/15
3870
微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
实现表格行的拖拽以及分页
在做一些后台管理系统时,表格的数据信息展示是很常见的需求,而对应的都是一些增删改查的操作
itclanCoder
2021/12/06
3.1K0
实现表格行的拖拽以及分页
猿实战13——实现你没听说过的前台类目
上几个章节,猿人君教会了你实现了属性/属性值和后台类目的绑定关系,今天,猿人君就带你来实现前台类目。
山旮旯的胖子
2020/09/23
6720
猿实战13——实现你没听说过的前台类目
Vue电商实践项目(二)
1.实现后台首页的基本布局 2.实现左侧菜单栏 3.实现用户列表展示 4.实现添加用户
用户6808043
2022/02/24
5.1K0
vue表格分页以及增删改查的实际应用
效果 1:表格以及分页 2:增加一条数据 3:删除一条数据 4:修改一条数据 5:查询一条数据 实例: <template> <div class="tab-container"> <d
王小婷
2021/03/17
1.9K0
TienChin-课程管理-添加课程页面
这个 index.vue 是 course 文件夹下面的 index.vue 别弄错了。
程序员NEO
2023/10/12
2200
Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能
最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时,直接拿来应用。
朱季谦
2023/07/21
6.4K0
Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能
vue3+element-plus 表格table实现树状结构父子级互不影响
用户5899361
2024/01/31
1.1K0
element ui 图片上传封装多张或单张
最近写了一个后台管理项目,发现每个后台项目都离不开上传图片,决定把上传图片做个封装,话不多说直接上代码!
前端小白@阿强
2020/08/11
2.4K0
手把手教你实现一个Vue无限级联树形表格(增删改)
平时我们可能在做项目时,会遇到一个业务逻辑。实现一个无限级联树形表格,什么叫做无限级联树形表格呢?就是下图所展示的内容,有一个祖元素,然后下面可能有很多子孙元素,你可以实现添加、编辑、删除这样几个功能。
Vam的金豆之路
2021/12/01
5880
手把手教你实现一个Vue无限级联树形表格(增删改)
不需要web服务器,如何构建一个可以内部跨域的http服务(Vue+Flask)
前端把需要测试的接口地址,报文通过axios 发送给后端Flask服务,Flask服务通过 requests 模块实现测试
山河已无恙
2023/03/02
8560
推荐阅读
相关推荐
TienChin 活动管理-添加活动页面
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验