2016-09-20 5 views
-1

私はプロジェクトオイラーの問題を解決し、ここproblem 35のための私のコードでてきました。なぜValueErrorは同一のコードでも、他のコードでは取得できないのですか?

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:基数10のint()のリテラルが無効です。" "すべてを試しましたが、それでも動作しませんでした。ここに私のコードです:

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 

ここからわかるように、ここのコードのほとんどは、以前の問題からコピーされ貼り付けられています。なぜ今はうまくいかないのですか?これをどうやって解決するのですか?

答えて

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' 
>>> 

、トレースバックに掘り、我々はあなたが終わる見ますis_trunctable_from_the_rightでこのような状況で:あなたはあなたの文字列を切り捨てるとき

>>> for x in range(len(n)-1): 
... print n[:i] 
... 

>>> n 
'11' 
>>> range(len(n)-1) 
[0] 

は、だから、intにその空の文字列を渡して、空の文字列を返しています、これはエラーをスローしています。

1

エラーが発生した行については言及していません。それが助けになりました。また、コードの多くが動作しています。だから、ちょうど異なるビットに焦点を合わせる:切り詰め。

Iエラーこのint(n[:i])

にある無効なリテラル文字列が空の文字列であり、それは可能な範囲は、0から始まり、第1項はゼロ長ストリング

ValueError: invalid literal for int() with base 10: '' 

ある疑いそれを数字に変換する。だから、レンジ文を修正する:

(isprime(int(n[:i])) for i in range(1,len(n))) 
関連する問題