Python3 欧拉计划 问题41-45

作者: AiFany | 来源:发表于2018-01-02 14:12 被阅读0次
    EulerProject.png
    问题36—40参见:https://www.jianshu.com/p/e455bf4ccfc9

    41、全数字的素数

      如果一个n位数恰好使用了1至n每个数字各一次,我们就称其为全数字的。例如,2143就是一个4位全数字数,同时它恰好也是一个素数。
      最大的全数字的素数是多少。

    Python3解答
    #这个数字不可能是8、9位数。因为可以被3整除。
    def an_pri(number):#判断素数
        if number==2:
            return True
        elif number>2:
            for i in range(2,int(number**0.5)+1):
                if number%i==0:
                    return False
            return True
        elif number==1:
            return False
    def an_lastdi(number):#根据尾数筛选素数
        hu,hh=[2,4,6,8,5],list(str(number))
        if int(hh[-1]) in hu:
            return False
        return True
    def an_len(number):#根据数字长度筛选素数
        uh=len(str(number))
        if uh==9 or uh==6 or uh==3:
            return False
        return True
    def an_once(number):#判断全数字的
        hu=list(str(number))
        uh,an_hu=list(range(1,len(hu)+1)),[]
        for j in hu:
            an_hu.append(int(j))
        if sorted(an_hu)==uh:
            return True
    for i in range(7654321,1,-1):
        if an_len(i) and an_lastdi(i) and an_once(i):
            if an_pri(i):
                print(i)
                break
    答案:7652413
    

    42、三角形单词

      三角形数序列的第n项tn可由公式n(n+1)/2得到;因此前十个三角形数是:
        1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
    将一个单词中的每个字母分别转化为其在字母表中的顺序并相加,我们可以计算出一个单词的值。例如,单词SKY的值就是 19 + 11 + 25 = 55 = t10。如果一个单词的值是一个三角形数,我们就称这个单词为三角形单词
      在文件words.txt 中包含有将近两千个常用英文单词,这其中有多少个三角形单词。

    Python3解答
    #读取文件
    with open(r'C:\Users\GWT9\Desktop\p042_words.txt')as an_file:
        fan=an_file.read()
        fan_an=fan.replace('"','').split(',')
    #判断是否为三角形数
    def an_trin(number):
        sboot = int((2*number)**0.5)
        if 2*number==sboot*(sboot+1):
            return True
    #计算单词中字母对应的顺序之和
    def an_ord(str1):
        return sum(ord(i)-64 for i in str1)
    fan=0
    for h in fan_an:
        if an_trin(an_ord(h)):
            fan+=1
    print(fan)
    答案:162
    

    43、子串可整除

      1406357289是一个0至9的全数字数,因为它由0到9这十个数字排列而成;但除此之外,它还有一个有趣的性质:子串可整除
      记d1是它的第一个数字,d2是第二个数字,依此类推,我们注意到:
        d2d3d4=406能被2整除
        d3d4d5=063能被3整除
        d4d5d6=635能被5整除
        d5d6d7=357能被7整除
        d6d7d8=572能被11整除
        d7d8d9=728能被13整除
        d8d9d10=289能被17整除
      找出所有满足同样性质的0至9全数字数,并求它们的和。

    Python3解答
    from itertools import permutations as ip#引入组合库
    hh=[''.join(list(i)) for i in list(ip('1023456789'))]
    alldigit = []
    for i in hh:
        if i[0]!='0':
            if int(i[7:10])%17==0:
                if int(i[6:9])%13==0:
                    if int(i[5:8])%11==0:
                        if int(i[4:7])%7==0:
                            if i[5] in ['0','5']:
                                if int(i[2:5])%3==0:
                                    if int(i[3])%2==0:
                                        alldigit.append(int(i))
    print(alldigit)
    print(sum(alldigit))
    答案:满足此条件的数:[1406357289, 1430952867, 1460357289, 4106357289, 4130952867, 4160357289]
    所有数之和:16695334890
    

    44、五边形数

      五边形数是由公式Pn=n(3n−1)/2生成。前10个五边形数是:
        1, 5, 12, 22, 35, 51, 70, 92, 117, 145, …
    可以看出P4 + P7 = 22 + 70 = 92 = P8。然而,它们的差70 − 22 = 48并不是五边形数。
      在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对,此时D的值是。

    Python3解答
    def an_pan(number):#判断是否为五边形数
        if ((24*number+1)**0.5+1)%6==0:
            return True
    an_set,i,af=set(),0,1
    while af!=0:
        i+=1
        fan=int(i*(3*i-1)/2)
        an_set.add(fan)
        for an in an_set:
            if fan-an in an_set and an_pan(an+fan):
                print(fan, an, fan-an)
                af=0
    答案:五边形数对【7042750 ,1560090】
    差为:5482660
    

    45、三角形数、五边形数和六角形数

      三角形数、五边形数和六角形数分别由以下公式给出:
        三角形数 Tn=n(n+1)/2 1, 3, 6, 10, 15, …
        五边形数 Pn=n(3n−1)/2 1, 5, 12, 22, 35, …
        六边形数 Hn=n(2n−1) 1, 6, 15, 28, 45, …
    可以验证,T285 = P165 = H143 = 40755。
      找出下一个同时是三角形数、五边形数和六角形数的数。

    Python3解答
    def an_fan(num):
        if((24*num+1)**0.5+1)%6==0:#判断五边形数
            if ((8*num+1)**0.5+1)%4==0:#判断六角形数
                return True
    n=285
    while True:
        n+=1
        fan=int(n*(n+1)/2)#三角形数
        if an_fan(fan):
            print(fan)
            break
    答案:1533776805
    

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

    相关文章

      网友评论

        本文标题:Python3 欧拉计划 问题41-45

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