欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)完全數(shù)的示例詳解

 更新時(shí)間:2023年01月06日 08:33:27   作者:??????  
完全數(shù),又稱完美數(shù),定義為:這個(gè)數(shù)的所有因數(shù)(不包括這個(gè)數(shù)本身)加起來剛好等于這個(gè)數(shù)。本文就來用Python實(shí)現(xiàn)計(jì)算完全數(shù),需要的可以參考一下

一、前言

卷起來好吧,元旦已經(jīng)過了,就開始寫文章模式了。

這篇文章會(huì)對(duì)完全數(shù)的各種偵測(cè)進(jìn)行詳細(xì)解釋。寫作不易,支持一波~

二、完全數(shù)是什么

1、定義

老規(guī)矩,先來了解完全數(shù)是什么。

完全數(shù),又稱完美數(shù),定義為:這個(gè)數(shù)的所有因數(shù)(不包括這個(gè)數(shù)本身)加起來剛好等于這個(gè)數(shù)。比如6就是完全數(shù),因?yàn)?的因數(shù)有1,2,3(不包括6本身),1+2+3正好等于6。

所以如果有人給你扣6,那說明他在夸贊你十分完美(bushi。

完全數(shù)是一個(gè)叫畢達(dá)哥拉斯的提出來的,被譽(yù)為“最古老的數(shù)學(xué)問題”,這人還提出了我們熟悉的勾股定理和黃金比例。

目前一共找到了51個(gè)完全數(shù),非常的稀有,比較小的有6、28、496、8128、33550336等等。

目前還沒有人找到奇數(shù)完全數(shù),也沒有人能證明“沒有奇數(shù)完全數(shù)”。但是,一個(gè)叫做奧斯丁·歐爾的人證明出來:要是有奇完全數(shù),必須能表示成12x質(zhì)數(shù)+1或者36x質(zhì)數(shù)+9,并且在10^300以內(nèi)沒有奇完全數(shù)的存在。

完全數(shù)會(huì)越來越大,第39個(gè)完全數(shù)有25674127位數(shù),如果用四號(hào)字字體打印出來,也能變成一本字典。

2、規(guī)律

這些數(shù)之間有沒有一些規(guī)律呢?

有,并且很多。(以下規(guī)律僅僅是目前發(fā)現(xiàn)的完全數(shù)都符合這個(gè)定律,部分未證明)

第一,完全數(shù)都是以6或28結(jié)尾的。

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

第三,除了6以外都可以表示成連續(xù)隔2奇立方數(shù)之和。例如28表示成1^3+3^3,496表示成1^3+3^3+5^3+7^3。

第四,完全數(shù)的所有因數(shù)的倒數(shù)的和為2。例如6所有因數(shù)的倒數(shù)是1,1/2,1/3,1/6,相加為2。28所有因數(shù)的倒數(shù)是1,1/2,1/4,1/7,1/14,1/28,相加為2。

第五,完全數(shù)都可以表示成2的連續(xù)數(shù)次方之和。例如6可以表示成2^1+2^2,28可以表示成2^2+2^3+2^4。

第六,6以外的完全數(shù)經(jīng)過碾轉(zhuǎn)之后為1。碾轉(zhuǎn)就是把他的各個(gè)位數(shù)相加一直到只剩一位數(shù)。例如28碾轉(zhuǎn)數(shù)為:2+8=10,1+0=1。496碾轉(zhuǎn)數(shù)為:4+9+6=19,1+9=10,1+0=1。

第七,6以外的完全數(shù)除以9一定余數(shù)為1。例如:28除以9=3…1,496除以9=55…1。

知道為啥有一個(gè)別名叫完美數(shù)了吧?太完美了!

3、梅森素?cái)?shù)

之后又冒出來了一個(gè)梅森素?cái)?shù),這是歐幾里得整出來的。我們定義P是一個(gè)質(zhì)數(shù),如果2^p-1也是質(zhì)數(shù),那么這個(gè)質(zhì)數(shù)就是“梅森素?cái)?shù)”。

知道梅森素?cái)?shù)之后,把P帶入公式2^(p-1)(2^p-1),咔咔一頓算,結(jié)果就是完全數(shù)。

我們想想是不是這樣。

因?yàn)?是質(zhì)數(shù),2^2-1是3也是質(zhì)數(shù),那么3就是梅森素?cái)?shù)。把2帶入公式,咔咔一頓算結(jié)果就是6。

3是質(zhì)數(shù),2^3-1是7也是質(zhì)數(shù),那么7就是梅森素?cái)?shù)。把3帶入公式,咔咔一頓算結(jié)果就是28。

歐拉證明出來,所有完全數(shù)都符合這個(gè)形式。有了這個(gè)公式計(jì)算就更簡便了。

三、版本(1.0):硬算

接下來,我們先寫程序硬算一遍。

我們需要讓程序找到一個(gè)數(shù)的每一個(gè)除了本身之外的因數(shù),還要把它們都加起來,這些程序可以放在一個(gè)函數(shù)里面。之后再套上循環(huán),數(shù)自增重復(fù)調(diào)用就行了。是不是很簡單?

先完成找數(shù)的所有因數(shù)的效果。

我們要?jiǎng)?chuàng)建一個(gè)函數(shù),用for循環(huán)和range套上要尋找的數(shù)字,如果這個(gè)數(shù)是要尋找的數(shù)字的因數(shù),就用一個(gè)變量自增。檢測(cè)結(jié)束后檢測(cè)因數(shù)和要尋找的數(shù)字是否相等,返回真或假。

def find(find_number):#新建函數(shù)find查找因數(shù)并進(jìn)行判斷
    he=0#初始化變量
    for i in range(1,find_number):#循環(huán)find_number次
        if find_number%i==0:#如果i是find_number的因數(shù)
            he=he+i#賦值
    #這時(shí)候,he就是find_number所有因數(shù)的和了
    if he==find_number:#比較
        return True
    else:
        return False

最關(guān)鍵的部分已經(jīng)做好了,補(bǔ)全代碼你可以自己試試~

補(bǔ)全代碼,先詢問要檢測(cè)到哪里,之后while循環(huán)或者for+range來計(jì)數(shù),調(diào)用函數(shù)獲取信息,十分的簡單。

完整程序就是這樣:

def find(find_number):#新建函數(shù)find查找因數(shù)并進(jìn)行判斷
    he=0#初始化變量
    for i in range(1,find_number):#循環(huán)find_number次
        if find_number%i==0:#如果i是find_number的因數(shù)
            he=he+i
    #這時(shí)候,he就是find_number所有因數(shù)的和了
    if he==find_number:#比較
        return True
    else:
        return False
a=int(input("輸入要檢測(cè)1到多少位的完全數(shù)"))
for i in range(1,a+1):
    if find(i):
        print(i,"是完全數(shù)")

四、版本1.1:數(shù)的末尾偵測(cè)

從上文我們可以知道,完全數(shù)的末尾都是6或者28,這樣的話,我們就又能節(jié)約一下運(yùn)行時(shí)間了。

有人問了:誒誒誒,怎么知道一個(gè)整數(shù)的末尾是多少呢?

很簡單,變成字符串再截取就行了。

def find(find_number):#新建函數(shù)find查找因數(shù)并進(jìn)行判斷
    he=0#初始化變量
    for i in range(1,find_number):#循環(huán)find_number次
        if find_number%i==0:#如果i是find_number的因數(shù)
            he=he+i
    #這時(shí)候,he就是find_number所有因數(shù)的和了
    if he==find_number:#比較
        return True
    else:
        return False
a=int(input("輸入要檢測(cè)1到多少位的完全數(shù)"))
for i in range(1,a+1):
    if str(i)[-1]=='6' or str(i)[-1]=='8':
        if find(i):
            print(i,"是完全數(shù)")

這樣運(yùn)行速度直接快了一倍好吧。

五、版本1.2:除以9偵測(cè)

完全數(shù)除以9都余1,我們也可用這一點(diǎn)來加快運(yùn)行速度。不過,千萬不要忽略“排除6”,再加一個(gè)是不是6的偵測(cè)??雌饋砀鼰┈嵙?,但是這樣做將近能快3倍速度。

def find(find_number):#新建函數(shù)find查找因數(shù)并進(jìn)行判斷
    he=0#初始化變量
    for i in range(1,find_number):#循環(huán)find_number次
        if find_number%i==0:#如果i是find_number的因數(shù)
            he=he+i
    #這時(shí)候,he就是find_number所有因數(shù)的和了
    if he==find_number:#比較
        return True
    else:
        return False
a=int(input("輸入要檢測(cè)1到多少位的完全數(shù)"))
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,"是完全數(shù)")

六、版本2.0:梅森素?cái)?shù)偵測(cè)

這是最后的終極方法,就是尋找梅森素?cái)?shù)。

首先還是要偵測(cè)素?cái)?shù)的大循環(huán),if來判斷素?cái)?shù)是不是梅森素?cái)?shù),是的話就代入公式輸出,十分的簡單。

在上一個(gè)哥德巴 赫猜想的文章里面已經(jīng)有了素?cái)?shù)偵測(cè)的函數(shù),這里直接拿過來用,誒嘿。

c,運(yùn)行太快了,停不住了,誒!

(嗶~)

我們?cè)偌右粋€(gè)等待時(shí)間就好了,有點(diǎn)快了。

from time import sleep
zhishu=[]#儲(chǔ)存質(zhì)數(shù)的列表
for i in range(2,10000):#循環(huán)檢測(cè)質(zhì)數(shù)
    for j in range(2,i-1):#2到i內(nèi)的每一個(gè)數(shù)
        if i%j==0:#如果i不是質(zhì)數(shù)
            break#退出循環(huán)
    else:#如果正常結(jié)束循環(huán)就是i是質(zhì)數(shù)
        zhishu.append(i)#zhishu添加i
 
for shu in zhishu:
    if 2**shu-1 in zhishu:
        print(2**(shu-1)*(2**shu-1),"是完全數(shù)")
        sleep(1)

但是這樣檢測(cè)有一個(gè)致命的缺點(diǎn)——只能檢測(cè)10000以內(nèi)的,因?yàn)槲覀冇玫氖莍n來判斷2**shu-1是不是質(zhì)數(shù),大于10000就沒有了,要是能有一個(gè)質(zhì)數(shù)表數(shù)據(jù)的話,肯定能找他十幾個(gè)。

到此這篇關(guān)于Python實(shí)現(xiàn)完全數(shù)的示例詳解的文章就介紹到這了,更多相關(guān)Python完全數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Python中f-string的幾個(gè)技巧,你都知道嗎

    在Python中f-string的幾個(gè)技巧,你都知道嗎

    f-string想必很多Python用戶都基礎(chǔ)性的使用過,但是百分之九十的人不知道?在Python中f-string的幾個(gè)技巧,今天就帶大家一起看看Python f-string技巧大全,需要的朋友參考下吧
    2021-10-10
  • Python2.7下安裝Scrapy框架步驟教程

    Python2.7下安裝Scrapy框架步驟教程

    本篇文章主要介紹了Python2.7下安裝Scrapy框架步驟教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • 簡單理解Python中的事件循環(huán)EventLoop

    簡單理解Python中的事件循環(huán)EventLoop

    在 python 3中,加入了 asyncio 模塊,來實(shí)現(xiàn)協(xié)程,其中一個(gè)很重要的概念是事件循環(huán),本文我們就來自己實(shí)現(xiàn)一個(gè)相對(duì)簡單的EventLoop,從而了解一下事件循環(huán)是如何進(jìn)行運(yùn)轉(zhuǎn)的吧
    2023-10-10
  • python 兩種方法刪除空文件夾

    python 兩種方法刪除空文件夾

    這篇文章主要介紹了python 兩種方法刪除空文件夾,幫助大家更好的利用python處理文件,感興趣的朋友可以了解下
    2020-09-09
  • 解決python DataFrame 打印結(jié)果不換行問題

    解決python DataFrame 打印結(jié)果不換行問題

    這篇文章主要介紹了解決python DataFrame 打印結(jié)果不換行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • pytorch獲取vgg16-feature層輸出的例子

    pytorch獲取vgg16-feature層輸出的例子

    今天小編就為大家分享一篇pytorch獲取vgg16-feature層輸出的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python決策樹預(yù)測(cè)學(xué)生成績等級(jí)實(shí)現(xiàn)詳情

    python決策樹預(yù)測(cè)學(xué)生成績等級(jí)實(shí)現(xiàn)詳情

    這篇文章主要為介紹了python決策樹預(yù)測(cè)學(xué)生成績等級(jí),使用決策樹完成學(xué)生成績等級(jí)預(yù)測(cè),可選取部分或全部特征,分析參數(shù)對(duì)結(jié)果的影響,并進(jìn)行調(diào)參優(yōu)化,決策樹可視化進(jìn)行調(diào)參優(yōu)化分析
    2022-04-04
  • Python PyQt5實(shí)戰(zhàn)項(xiàng)目之網(wǎng)速監(jiān)控器的實(shí)現(xiàn)

    Python PyQt5實(shí)戰(zhàn)項(xiàng)目之網(wǎng)速監(jiān)控器的實(shí)現(xiàn)

    PyQt5以一套Python模塊的形式來實(shí)現(xiàn)功能。它包含了超過620個(gè)類,600個(gè)方法和函數(shù)。它是一個(gè)多平臺(tái)的工具套件,它可以運(yùn)行在所有的主流操作系統(tǒng)中,包含Unix,Windows和Mac OS。PyQt5采用雙重許可模式。開發(fā)者可以在GPL和社區(qū)授權(quán)之間選擇
    2021-11-11
  • 淺談Django+Gunicorn+Nginx部署之路

    淺談Django+Gunicorn+Nginx部署之路

    這篇文章主要介紹了Django+Gunicorn+Nginx部署之路,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python六大開源框架對(duì)比

    Python六大開源框架對(duì)比

    在這篇文章里,我們將為Python Web開發(fā)者回顧基于Python的6大Web應(yīng)用框架。無論你是出于愛好還是需求,這六大框架都可能會(huì)成為你工作上不錯(cuò)的得力助手。
    2015-10-10

最新評(píng)論