【发布时间】:2015-01-22 19:20:03
【问题描述】:
问题: 数字 3797 有一个有趣的特性。作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797、797、97 和 7。类似地,我们可以从右到左工作:3797、379、37 和 3。
找出唯一可以从左到右和从右到左截断的十一个素数的总和。注意:2、3、5 和 7 不被视为可截断的素数。
我的代码只能输出前五个这样的数字并显示以下错误:
Traceback (most recent call last):
File "main.py", line 41, in
if check(i) and check(rev(i)):
File "main.py", line 30, in check
if sieve[n]:
IndexError: list index out of range
代码:
sieve = [True] * 1000001 # Sieve is faster for 2M primes
def mark(sieve, x):
for i in xrange(x+x, len(sieve), x):
sieve[i] = False
sieve[0],sieve[1]=False,False
for x in xrange(2, int(len(sieve) ** 0.5) + 1):
if sieve[x]: mark(sieve, x)
def rev(n):
s=0
while n>0:
s=s*10+n%10
n/=10
return s
def check(n):
flag=1
while n>0:
if sieve[n]:
n/=10
else:
flag=0
break
return flag==1
ctr=0
i=11
s=0
while ctr!=11:
if check(i) and check(rev(i)):
print i
s+=i
ctr+=1
i+=1
print s
lww=raw_input()
【问题讨论】:
-
你是不是刚从筛子的末端跑掉了?
-
这似乎很有可能。你知道第 11 个双向截断素数有多大吗?
-
如果您只是添加一些代码来捕获异常和
print n,我们实际上会知道这是否是问题所在,而不必猜测...... -
根据A020994,左截断和右截断的素数分别是2、3、5、7、23、37、53、73、313、317、373、797 , 3137, 3797, 739397。因此,如果他的筛子和测试实施正确,它们都将适合。 (不过,很好的猜测,@user2357112,即使它不是答案。)
标签: python