網站首頁 編程語言 正文
一、前言
卷起來好吧,元旦已經過了,就開始寫文章模式了。
這篇文章會對完全數的各種偵測進行詳細解釋。寫作不易,支持一波~
二、完全數是什么
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就沒有了,要是能有一個質數表數據的話,肯定能找他十幾個。
原文鏈接:https://blog.csdn.net/C_ygxb/article/details/128439029
相關推薦
- 2022-10-20 初識Android?PowerManagerService省電模式_Android
- 2022-12-29 React引入css的三種方式小結_React
- 2022-09-14 前端使用svg圖片改色實現示例_其它綜合
- 2022-12-28 Django初步使用Celery處理耗時任務和定時任務問題_python
- 2022-03-24 postman接口做關聯測試的方法步驟_相關技巧
- 2023-05-06 Python正則表達式中group與groups的用法詳解_python
- 2022-05-07 Python中list列表的賦值方法及遇到問題處理_python
- 2022-10-26 jQuery中DOM?屬性使用實例詳解上篇_jquery
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支