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=13+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.pswp.cn/news/538815.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538815.shtml
英文地址,請注明出處:http://en.pswp.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語言書中…