Python3 歐拉計(jì)劃 問題51-55

EulerProject.png

問題46—50參見:http://www.itdecent.cn/p/530e1482169e

51、素?cái)?shù)數(shù)字替換

??將兩位數(shù)a3的第一個(gè)數(shù)字替換為任意數(shù)字,在九個(gè)可能值中有六個(gè)是素?cái)?shù):
????13、23、43、53、73、83
將五位數(shù)56aa3的第三和第四位數(shù)字替換為相同的任意數(shù)字,十個(gè)可能值中有七個(gè)是素?cái)?shù),這7個(gè)素?cái)?shù)是:
????56003、56113、56333、56443、56663、56773、56993
56003作為最小的數(shù),也是最小的滿足這個(gè)性質(zhì)的素?cái)?shù)。
??通過將部分?jǐn)?shù)字(不一定相鄰)替換為相同的任意數(shù)字,有時(shí)能夠得到八個(gè)素?cái)?shù),求滿足這一性質(zhì)的最小素?cái)?shù)。

Python3解答
import itertools#引入組合庫
def JudgePrime(num):#判斷素?cái)?shù)
    if num==1 or num==2:
        return False
    else:
        for i in range(2,int(num**0.5)+1):
            if num%i==0:
                return False
        return True
def JuList(li):#判斷替換的數(shù)字序列中素?cái)?shù)的個(gè)數(shù)
    return [JudgePrime(i) for  i in li].count(True)
#判斷要加的數(shù)
def Jadd(num,s='1'):
    #記錄位置
    weizhi=[]
    fan=list(str(num))
    for i in fan[:-1]:#最后一位去除
        if i==s:
            t=fan.index(i)
            fan[fan.index(i)]='w'
            weizhi.append(len(fan)-t-1)
    #獲得全排列
    du=[]
    for ig in range(len(weizhi)):
        for gi in list(itertools.combinations(weizhi,ig+1)):
            du.append(gi)
    #根據(jù)全排列后的確定加的數(shù)字
    shuzi=[]
    for j in du:
        sumsum=0
        for js in j:
            sumsum+=10**js
        shuzi.append(sumsum)
    return shuzi
#開始
bu=0
st=100000
while bu!=1:
    if JudgePrime(st):
        for iss in range(3):
            for iadd in Jadd(st,s=str(iss)):
                jjuu=[st]
                for ij in range(1,9-int(iss)+1):
                    jjuu.append(st+ij*iadd)
                if JuList(jjuu)==8:
                    print(st,iadd,jjuu)
                    bu=1
        st+=1
    else:
        st+=1
答案:素?cái)?shù)序列為:[121313, 222323, 323333, 424343, 525353, 626363, 727373, 828383, 929393],第1,3,5位替換。
最小的素?cái)?shù):121313。

52、倍數(shù)重排

??125874和它的兩倍251748擁有同樣的數(shù)字,只是排列順序不同。有些正整數(shù)x滿足2x、3x、4x、5x和6x都擁有相同的數(shù)字,求其中最小的正整數(shù)。

Python3解答
def SameDigit(exlist):#判斷數(shù)字相同
    for i in  exlist:
        if set(i)!=set(exlist[0]):
            return False
    return True
Number=1
while 1:
    Nlist=[str(i*Number) for i in range(1,7)]
    if SameDigit(Nlist):
        print(Nlist)
        break
    else:
        Number+=1
答案:['142857', '285714', '428571', '571428', '714285', '857142']
結(jié)果:142857.

53、組合數(shù)

??從五個(gè)數(shù)1,2,3,4,5中選擇三個(gè)恰好有十種方式,分別是:
????123、124、125、134、135、145、234、235、245、345
在組合數(shù)學(xué)中,我們記作:C(5,3)= 10。一般來說,C(n,r)=n!/r!(n?r)!,其中r ≤ n,n! = n×(n?1)×…×3×2×1,且0! = 1。直到n = 23時(shí),才出現(xiàn)了超出一百萬的組合數(shù):C(23,10) =1144066。
??若數(shù)值相等形式不同也視為不同,對(duì)于1 ≤ n ≤ 100,有多少個(gè)組合數(shù)C(n,r)超過一百萬。

Python3解答
def GetComb(m, n):  # 計(jì)算數(shù)的組合值
    pro = 1
    orp = 1
    for i in range(m + 1 - n, m + 1):
        pro *= i
    for j in range(1, n + 1):
        orp *= j
    return pro / orp
ji = 0
for i in range(1, 101):
    for j in range(1, i):
        if GetComb(i, j) >= 1e6:
            ji += 1
print(ji)
答案:4075

54、撲克游戲

答案參見: http://www.itdecent.cn/p/e3a3dc1f7919

55、利克瑞爾數(shù)

??將47倒序并相加得到47 + 74 = 121,是一個(gè)回文數(shù)。不是所有的數(shù)都能像這樣迅速地變成回文數(shù)。例如:
????349 + 943 = 1292,1292 + 2921 = 4213,4213 + 3124 = 7337
也就是說,349需要迭代三次才能變成回文數(shù)。
??以下陳述盡管尚未被證實(shí),但有些數(shù),例如196,被認(rèn)為永遠(yuǎn)不可能變成回文數(shù)。如果一個(gè)數(shù)永遠(yuǎn)不可能通過倒序并相加變成回文數(shù),就被稱為利克瑞爾數(shù)。出于理論的限制和問題的要求,在未被證否之前,我們姑且就認(rèn)為這些數(shù)確實(shí)是利克瑞爾數(shù)。
??除此之外,已知對(duì)于任意一個(gè)小于一萬的數(shù),它要么在迭代50次以內(nèi)變成回文數(shù),要么就是沒有人能夠利用現(xiàn)今所有的計(jì)算能力將其迭代變成回文數(shù)。事實(shí)上,10677是第一個(gè)需要超過50次迭代變成回文數(shù)的數(shù),這個(gè)回文數(shù)是
????4668731596684224866951378664(53次迭代,28位數(shù))
??令人驚訝的是,有些回文數(shù)本身也是利克瑞爾數(shù)數(shù);第一個(gè)例子是4994。
??小于一萬的數(shù)中有多少利克瑞爾數(shù)。

Python3解答
def JudgeP(number):#判斷回文數(shù)
    stnu = str(number)
    for i in range(int(len(stnu) / 2)):
        if stnu[i] != stnu[-i - 1]:
            return False
    return True
def Lcyder(number, nu=50):#50次之內(nèi)變不成回文數(shù)
    d = nu
    while d > 0:
        number += int(str(number)[::-1])
        if JudgeP(number):
            return True
        else:
            d -= 1
    return False
d = 0
for i in range(10000):
    if not Lcyder(i):
        d += 1
print(d)
答案:249

持續(xù)更新,歡迎討論,敬請(qǐng)關(guān)注!?。?/strong>??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容