美文网首页程序员
Python3 欧拉计划 问题51-55

Python3 欧拉计划 问题51-55

作者: AiFany | 来源:发表于2018-01-08 10:23 被阅读103次
    EulerProject.png
    问题46—50参见:https://www.jianshu.com/p/530e1482169e

    51、素数数字替换

      将两位数a3的第一个数字替换为任意数字,在九个可能值中有六个是素数:
        13、23、43、53、73、83
    将五位数56aa3的第三和第四位数字替换为相同的任意数字,十个可能值中有七个是素数,这7个素数是:
        56003、56113、56333、56443、56663、56773、56993
    56003作为最小的数,也是最小的满足这个性质的素数。
      通过将部分数字(不一定相邻)替换为相同的任意数字,有时能够得到八个素数,求满足这一性质的最小素数。

    Python3解答
    import itertools#引入组合库
    def JudgePrime(num):#判断素数
        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):#判断替换的数字序列中素数的个数
        return [JudgePrime(i) for  i in li].count(True)
    #判断要加的数
    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)
        #根据全排列后的确定加的数字
        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
    答案:素数序列为:[121313, 222323, 323333, 424343, 525353, 626363, 727373, 828383, 929393],第1,3,5位替换。
    最小的素数:121313。
    

    52、倍数重排

      125874和它的两倍251748拥有同样的数字,只是排列顺序不同。有些正整数x满足2x、3x、4x、5x和6x都拥有相同的数字,求其中最小的正整数。

    Python3解答
    def SameDigit(exlist):#判断数字相同
        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']
    结果:142857.
    

    53、组合数

      从五个数1,2,3,4,5中选择三个恰好有十种方式,分别是:
        123、124、125、134、135、145、234、235、245、345
    在组合数学中,我们记作:C(5,3)= 10。一般来说,C(n,r)=n!/r!(n−r)!,其中r ≤ n,n! = n×(n−1)×…×3×2×1,且0! = 1。直到n = 23时,才出现了超出一百万的组合数:C(23,10) =1144066。
      若数值相等形式不同也视为不同,对于1 ≤ n ≤ 100,有多少个组合数C(n,r)超过一百万。

    Python3解答
    def GetComb(m, n):  # 计算数的组合值
        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、扑克游戏

    答案参见: https://www.jianshu.com/p/e3a3dc1f7919

    55、利克瑞尔数

      将47倒序并相加得到47 + 74 = 121,是一个回文数。不是所有的数都能像这样迅速地变成回文数。例如:
        349 + 943 = 1292,1292 + 2921 = 4213,4213 + 3124 = 7337
    也就是说,349需要迭代三次才能变成回文数。
      以下陈述尽管尚未被证实,但有些数,例如196,被认为永远不可能变成回文数。如果一个数永远不可能通过倒序并相加变成回文数,就被称为利克瑞尔数。出于理论的限制和问题的要求,在未被证否之前,我们姑且就认为这些数确实是利克瑞尔数。
      除此之外,已知对于任意一个小于一万的数,它要么在迭代50次以内变成回文数,要么就是没有人能够利用现今所有的计算能力将其迭代变成回文数。事实上,10677是第一个需要超过50次迭代变成回文数的数,这个回文数是
        4668731596684224866951378664(53次迭代,28位数)
      令人惊讶的是,有些回文数本身也是利克瑞尔数数;第一个例子是4994。
      小于一万的数中有多少利克瑞尔数。

    Python3解答
    def JudgeP(number):#判断回文数
        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次之内变不成回文数
        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
    

    持续更新,欢迎讨论,敬请关注!!!  

    相关文章

      网友评论

        本文标题:Python3 欧拉计划 问题51-55

        本文链接:https://www.haomeiwen.com/subject/wvmvnxtx.html