2014-01-18 3 views
1

QUESTION: The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3.코드에 논리적 오류가 있습니까?

Find the sum of the only eleven primes that are both truncatable from left to right and right to left. NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes.

내 코드 출력 처음 다섯 개 같은 번호 만 수 있으며, 다음과 같은 오류를 보여줍니다

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() 
+2

아마도 체의 끝에서 도망 갔을까요? – user2357112

+0

그럴 가능성이 있습니다. 11 번째 양방향으로 잘라낼 수있는 소수가 얼마나 큰지 아십니까? – jonrsharpe

+0

예외를 잡아 내고'print n'을 잡을 코드를 추가하면 추측 할 필요없이 문제가된다면 실제로 알 수 있습니다 ... – abarnert

답변

5

알고리즘이 잘못되었습니다. pp이 오른쪽에서 왼쪽으로 잘리고, reverse(p)은 오른쪽에서 왼쪽으로 잘릴 수 있습니다.

그러나 문제는 p이 오른쪽에서 왼쪽으로 잘릴 수 있으며 p은 왼쪽에서 오른쪽으로 잘릴 수있는 소수를 찾을 것을 요청합니다. 왼쪽에서 오른쪽 방향의 p의 잘림 가능성은 reverse(p) 오른쪽에서 왼쪽 방향의 잘림 가능성과 동일하지 않습니다.

3797에 주어진 번호를 고려하십시오. 두 방향 모두에서 잘릴 수 있으므로 코드는이를 받아 들여야합니다. 그러나 그 반대로 7973은 오른쪽에서 왼쪽으로 잘릴 수 없으므로 코드에서이를 거부합니다. 이 일로 너를 끝내야 했어.

reverse을 없애고 대신 방향으로자를 수 있도록 검사 코드를 수정해야합니다. 당신이 체의 부족 때문에


당신은 IndexError를 얻을 수 - 코드가 올바르게 5 소수 pp이 truncatable되도록 미만 100 만 오른쪽에서 왼쪽과 reverse(p) truncatable되는 것을 계산 오른쪽 -왼쪽. 그때까지 루프가 빠져 나오지 않으므로 ( ctr < 11 이후) 코드는 sieve[len(sieve)]에 액세스하려고 시도하고 IndexError에 도달합니다.


또한 - 이것은 실제로 당신의 문제와 관련이 없습니다 - 나는 당신을 C 배경이나 그와 비슷한 것으로부터 가져옵니다. 표준 파이썬 스타일 규칙을 따르지 않기 때문에 코드를 읽기가 다소 어렵습니다. Project Euler의 정신에 입각하여이 문제를 해결 한 후에는 구현 한 내용을 수정하기 위해 this gist을 살펴보십시오. 1) 올바르게 작동하게하십시오. 및 2.) 표준 Pythonic 스타일에 더 가깝습니다.

+0

실제로 실제로 자바와 C 및 C++을 조금 해봤지만 액세스가 쉽고 코딩이 간단하기 때문에 파이썬을 배웠다. 물건) ... 진지하게 파이썬 스타일 관습에 대한 단서가 없다는 것은 내 파이썬 프로그램에서이를 구현할 수있는 방법을 제안 할 수 있다면 상당한 가치가있을 것이다! – vvv

+0

시간이 있다면, [PEP 8] (http://www.python.org/dev/peps/pep-0008/)을 읽어야합니다. 이것은 파이썬 스타일에 대한 권위있는 문서입니다. 특히 "코드 레이아웃"및 "명명 규칙"섹션을 살펴보십시오.가장 중요한 순간에 들여 쓰기와 일관성을 유지하십시오. 각 들여 쓰기 수준에 4 칸을 사용하십시오. 이제 코드에서 2 공간 및 4 공간 들여 쓰기가 혼합되어 나중에 들여 쓰기 버그가 발생할 수 있습니다. – senshin

관련 문제