Python3 欧拉计划 问题41-45

Python3 欧拉计划 问题41-45_第1张图片
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)