0037. 可截素数
* * * *
拉格朗日计划
* * * *
可截素数

3797是素数,不仅如此,若将其数字从左往右依次截去、以及从右往左依次截去,得到797,97,7,和379,37,3也仍都是素数。

若无论从左往右还是从右往左依次截去一个大于10的素数的数字,所得也仍都是素数,则称该素数称为可截素数。已知共有十一个可截素数,求这些数的和。

本题难度:



解答

由题意有理由猜测这些数都不大,猜测其上界,并检查该范围内的素数,稍加尝试即得这些素数是$23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397$,它们的和是$748317$。

target=1000000

d=[0]*target

n=2
while n < target:
    for i in range(n+n,target,n):
        d[i]=d[i]+1
    n=n+1
    while n < target and d[n]>0:
        n=n+1

primeList=[k for k in range(2,target) if d[k]==0]
primeSet=set(primeList)
      
i=4
res=[]
while i < len(primeList) and len(res) < 11:
    p=primeList[i]
    m=p/10
    while m>0 and m in primeSet:
        m/=10
    d=10**(len(str(p))-1)
    n=p%d
    while d>1 and n in primeSet:
        d/=10
        n%=d
    if m==0 and d==1:
        res.append(p)
    i=i+1

print res,sum(res)