我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python实现完全数的示例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python实现完全数的示例详解

一、前言

卷起来好吧,元旦已经过了,就开始写文章模式了。

这篇文章会对完全数的各种侦测进行详细解释。写作不易,支持一波~

二、完全数是什么

1、定义

老规矩,先来了解完全数是什么。

完全数,又称完美数,定义为:这个数的所有因数(不包括这个数本身)加起来刚好等于这个数。比如6就是完全数,因为6的因数有1,2,3(不包括6本身),1+2+3正好等于6。

所以如果有人给你扣6,那说明他在夸赞你十分完美(bushi。

完全数是一个叫毕达哥拉斯的提出来的,被誉为“最古老的数学问题”,这人还提出了我们熟悉的勾股定理和黄金比例。

目前一共找到了51个完全数,非常的稀有,比较小的有6、28、496、8128、33550336等等。

目前还没有人找到奇数完全数,也没有人能证明“没有奇数完全数”。但是,一个叫做奥斯丁·欧尔的人证明出来:要是有奇完全数,必须能表示成12x质数+1或者36x质数+9,并且在10^300以内没有奇完全数的存在。

完全数会越来越大,第39个完全数有25674127位数,如果用四号字字体打印出来,也能变成一本字典。

2、规律

这些数之间有没有一些规律呢?

有,并且很多。(以下规律仅仅是目前发现的完全数都符合这个定律,部分未证明)

第一,完全数都是以6或28结尾的。

第二,完全数都是三角形数,例如6可以表示成1+2+3,28可以表示成1+2+3+4+5+6+7。

第三,除了6以外都可以表示成连续隔2奇立方数之和。例如28表示成1^3+3^3,496表示成1^3+3^3+5^3+7^3。

第四,完全数的所有因数的倒数的和为2。例如6所有因数的倒数是1,1/2,1/3,1/6,相加为2。28所有因数的倒数是1,1/2,1/4,1/7,1/14,1/28,相加为2。

第五,完全数都可以表示成2的连续数次方之和。例如6可以表示成2^1+2^2,28可以表示成2^2+2^3+2^4。

第六,6以外的完全数经过碾转之后为1。碾转就是把他的各个位数相加一直到只剩一位数。例如28碾转数为:2+8=10,1+0=1。496碾转数为:4+9+6=19,1+9=10,1+0=1。

第七,6以外的完全数除以9一定余数为1。例如:28除以9=3…1,496除以9=55…1。

知道为啥有一个别名叫完美数了吧?太完美了!

3、梅森素数

之后又冒出来了一个梅森素数,这是欧几里得整出来的。我们定义P是一个质数,如果2^p-1也是质数,那么这个质数就是“梅森素数”。

知道梅森素数之后,把P带入公式2^(p-1)(2^p-1),咔咔一顿算,结果就是完全数。

我们想想是不是这样。

因为2是质数,2^2-1是3也是质数,那么3就是梅森素数。把2带入公式,咔咔一顿算结果就是6。

3是质数,2^3-1是7也是质数,那么7就是梅森素数。把3带入公式,咔咔一顿算结果就是28。

欧拉证明出来,所有完全数都符合这个形式。有了这个公式计算就更简便了。

三、版本(1.0):硬算

接下来,我们先写程序硬算一遍。

我们需要让程序找到一个数的每一个除了本身之外的因数,还要把它们都加起来,这些程序可以放在一个函数里面。之后再套上循环,数自增重复调用就行了。是不是很简单?

先完成找数的所有因数的效果。

我们要创建一个函数,用for循环和range套上要寻找的数字,如果这个数是要寻找的数字的因数,就用一个变量自增。检测结束后检测因数和要寻找的数字是否相等,返回真或假。

def find(find_number):#新建函数find查找因数并进行判断
    he=0#初始化变量
    for i in range(1,find_number):#循环find_number次
        if find_number%i==0:#如果i是find_number的因数
            he=he+i#赋值
    #这时候,he就是find_number所有因数的和了
    if he==find_number:#比较
        return True
    else:
        return False

最关键的部分已经做好了,补全代码你可以自己试试~

补全代码,先询问要检测到哪里,之后while循环或者for+range来计数,调用函数获取信息,十分的简单。

完整程序就是这样:

def find(find_number):#新建函数find查找因数并进行判断
    he=0#初始化变量
    for i in range(1,find_number):#循环find_number次
        if find_number%i==0:#如果i是find_number的因数
            he=he+i
    #这时候,he就是find_number所有因数的和了
    if he==find_number:#比较
        return True
    else:
        return False
a=int(input("输入要检测1到多少位的完全数"))
for i in range(1,a+1):
    if find(i):
        print(i,"是完全数")

四、版本1.1:数的末尾侦测

从上文我们可以知道,完全数的末尾都是6或者28,这样的话,我们就又能节约一下运行时间了。

有人问了:诶诶诶,怎么知道一个整数的末尾是多少呢?

很简单,变成字符串再截取就行了。

def find(find_number):#新建函数find查找因数并进行判断
    he=0#初始化变量
    for i in range(1,find_number):#循环find_number次
        if find_number%i==0:#如果i是find_number的因数
            he=he+i
    #这时候,he就是find_number所有因数的和了
    if he==find_number:#比较
        return True
    else:
        return False
a=int(input("输入要检测1到多少位的完全数"))
for i in range(1,a+1):
    if str(i)[-1]=='6' or str(i)[-1]=='8':
        if find(i):
            print(i,"是完全数")

这样运行速度直接快了一倍好吧。

五、版本1.2:除以9侦测

完全数除以9都余1,我们也可用这一点来加快运行速度。不过,千万不要忽略“排除6”,再加一个是不是6的侦测。看起来更烦琐了,但是这样做将近能快3倍速度。

def find(find_number):#新建函数find查找因数并进行判断
    he=0#初始化变量
    for i in range(1,find_number):#循环find_number次
        if find_number%i==0:#如果i是find_number的因数
            he=he+i
    #这时候,he就是find_number所有因数的和了
    if he==find_number:#比较
        return True
    else:
        return False
a=int(input("输入要检测1到多少位的完全数"))
for i in range(1,a+1):
    if str(i)[-1]=='6' or str(i)[-1]=='8':
        if i%9==1 or i==6:
            if find(i):
                print(i,"是完全数")

六、版本2.0:梅森素数侦测

这是最后的终极方法,就是寻找梅森素数。

首先还是要侦测素数的大循环,if来判断素数是不是梅森素数,是的话就代入公式输出,十分的简单。

在上一个哥德巴 赫猜想的文章里面已经有了素数侦测的函数,这里直接拿过来用,诶嘿。

c,运行太快了,停不住了,诶!

(哔~)

我们再加一个等待时间就好了,有点快了。

from time import sleep
zhishu=[]#储存质数的列表
for i in range(2,10000):#循环检测质数
    for j in range(2,i-1):#2到i内的每一个数
        if i%j==0:#如果i不是质数
            break#退出循环
    else:#如果正常结束循环就是i是质数
        zhishu.append(i)#zhishu添加i
 
for shu in zhishu:
    if 2**shu-1 in zhishu:
        print(2**(shu-1)*(2**shu-1),"是完全数")
        sleep(1)

但是这样检测有一个致命的缺点——只能检测10000以内的,因为我们用的是in来判断2**shu-1是不是质数,大于10000就没有了,要是能有一个质数表数据的话,肯定能找他十几个。

到此这篇关于Python实现完全数的示例详解的文章就介绍到这了,更多相关Python完全数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python实现完全数的示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现完全数的示例详解

完全数,又称完美数,定义为:这个数的所有因数(不包括这个数本身)加起来刚好等于这个数。本文就来用Python实现计算完全数,需要的可以参考一下
2023-01-06

C语言完数的实现示例

C语言中的完数指的是一个正整数,本文主要介绍了C语言完数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-20

python如何实现完全数

这篇文章主要介绍了python如何实现完全数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-20

Python实现数字小写转大写的示例详解

这篇文章主要为大家详细介绍了如何利用Python实现数字小写转大写的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2022-12-14

Python中实现插值法的示例详解

这篇文章详细阐述了Python中插值法,一种用于估计未知函数值的技术。它介绍了线性插值,并提供了使用NumPy的Python代码示例。文章还讨论了其他插值方法、插值法的应用以及其限制。通过理解插值法及其适用范围,读者可以利用它在数据分析、图像处理和科学计算等领域获得准确的预测。
Python中实现插值法的示例详解
2024-04-02

Python+flask实现restful接口的示例详解

这篇文章主要为大家详细介绍了Python如何利用flask实现restful接口,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2023-02-08

Python实现动态绘图的示例详解

matplotlib中的animation提供了动态绘图功能,这篇文章主要为大家详细介绍了Python如何利用matplotlib实现动态绘图,感兴趣的可以了解一下
2023-05-19

Java实现全图背景水印的示例详解

这篇文章主要为大家详细介绍了如何利用Java实现全图背景水印的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2023-02-10

MySQL实现数据更新的示例详解

目录一、方法分类二、具体用法(1)根据条件更新值(2)按照不同条件(批量)更新不同值三、实例(1)根据条件更新值(2)按照不同条件更新不同值一般在更新时会遇到以下场景:1.所有字段全部更新;2.根据条件更新字段中的某部分内容;3.根据
2023-02-08

Python实现UDP与TCP通信的示例详解

UDP是一种无连接的、不可靠的传输协议;TCP是一种可靠的、面向连接的传输协议。这篇文章主要介绍了Python实现UDP与TCP通信的方法,需要的可以参考一下
2023-03-23

Python实现动态条形图的示例详解

这篇文章主要为大家详细介绍了如何利用Python中的pynimate模块实现动态条形图的绘制,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-22

Python实现甘特图绘制的示例详解

相信在平常实际工作当中,需要对整体的项目做一个梳理,这时如果有一个网页应用能够对整体项目有一个可视化页面的展示,是不是会对你的实际工作有所帮助呢?今天小编就通过Python+Streamlit框架来绘制甘特图并制作可视化大屏,需要的可以参考一下
2023-05-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录