我一直在解决Project Euler问题,这是problem 35的代码:
def sieve_of_Erathosthenes():
sieve = [True] * 10**6
def mark(sieve, x):
for i in xrange(x+x, len(sieve), x):
sieve[i] = False
for x in xrange(2, int(len(sieve) ** 0.5) + 1):
if sieve[x]:
mark(sieve, x)
return list(str(i) for i in range(2, len(sieve)) if sieve[i])
def is_prime(n):
from math import sqrt
if all(n % i != 0 for i in xrange(2,int(sqrt(n))+1)):
return True
def is_circular_prime(p):
if all(is_prime(int(p[i:] + p[:i])) for i in xrange(len(p))):
return True
primes = sieve_of_Erathosthenes()
number_of_circular_primes = 0
for i in primes:
if is_circular_prime(i):
number_of_circular_primes += 1
print number_of_circular_primes
它按照我的意图工作并输出正确的解决方案。我使用类似的方法来解决problem 37,但我得到:“ValueError:int(无效的文字,基数为10:''。”我尝试了一切,但它仍然没有用。这是我的代码:
def sieve_of_Erathosthenes():
sieve = [True] * 10**5
def mark(sieve, x):
for i in xrange(x+x, len(sieve), x):
sieve[i] = False
for x in xrange(2, int(len(sieve) ** 0.5) + 1):
if sieve[x]:
mark(sieve, x)
return [str(i) for i in range(2, len(sieve)) if sieve[i] and i > 10]
def is_prime(n):
from math import sqrt
if all(n % i != 0 for i in xrange(2,int(sqrt(n))+1)):
return True
def is_trunctable_from_the_right(n):
if all(is_prime(int(n[:i])) for i in range(len(n)-1)):
return True
def is_trunctable_from_the_left(n):
if all(is_prime(int(n[i:])) for i in range(1,len(n))):
return True
primes = sieve_of_Erathosthenes()
trunctable_from_both_sides = 0
for i in primes:
if is_trunctable_from_the_left(str(i)) and is_trunctable_from_the_right(str(i)):
trunctable_from_both_sides += int(i)
print trunctable_from_both_sides
正如您所看到的,这里的大部分代码都是从上一个问题中复制并粘贴的。这次为什么不起作用?我该如何解决这个问题?
答案 0 :(得分:1)
您没有提到出现错误的行。那会有所帮助。你也知道很多代码的工作原理。所以只关注不同的位:截断。
我怀疑错误出现在int(n[:i])
范围从0开始,因此第一个术语是零长度字符串
ValueError: invalid literal for int() with base 10: ''
无效的文字字符串是空字符串,它无法将其转换为数字。所以修复范围声明:
(isprime(int(n[:i])) for i in range(1,len(n)))
答案 1 :(得分:1)
如果我运行您的代码,您会注意到i
为11时发生错误:
>>> primes = sieve_of_Erathosthenes()
>>>
>>> trunctable_from_both_sides = 0
>>> for i in primes:
... if is_trunctable_from_the_left(str(i)) and is_trunctable_from_the_right(str(i)):
... trunctable_from_both_sides += int(i)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in is_trunctable_from_the_right
File "<stdin>", line 2, in <genexpr>
ValueError: invalid literal for int() with base 10: ''
>>> i
'11'
>>>
所以,深入了解Traceback,我们发现你最终会遇到is_trunctable_from_the_right
中的情况:
>>> for x in range(len(n)-1):
... print n[:i]
...
>>> n
'11'
>>> range(len(n)-1)
[0]
因此,当您截断字符串时,返回一个空字符串,将该空字符串传递给int
,这会引发错误。