2017-01-06 3 views
0

지정된 범위 내에서 첫 번째 쌍의 소수를 찾아야합니다.이 소수는 서로간에 일정한 차이가 있어야하며 그 차이 내에서 다른 소수는 없어야합니다. 내 코드가 작동하는 것 같지만 고통스럽게 느리다 - 소수를 처리하기 위해리스트를 사용했기 때문에 나는 생각한다. 더 나은 접근 방법은 무엇입니까?파이썬은 소수를위한 목록 대신에 더 빠른 대안을 제공합니까?

g=difference; 
n=first number in range 
m= second number in range 

def gap(g,n,m): 

    prime_list = [] 
    for num in range(n,m+1): 
     if all(num%i!=0 for i in range(2,int(num**0.5)+1)): 
       prime_list.append(num) 

    if len(prime_list)<1: 
     return None 

    for pnum in prime_list: 
     for index in range(len(prime_list)): 
      pnum2 = prime_list[index] 
      diff = abs(pnum - pnum2) 

      if diff == g: 

       checker = abs(prime_list.index(pnum2) - prime_list.index(pnum)) 
       if checker <=1: 
        return [pnum, pnum2] 

Some tests: 
    Test.assert_equals(gap(2,100,110), [101, 103]) 
    Test.assert_equals(gap(4,100,110), [103, 107]) 
    Test.assert_equals(gap(2, 10000000, 11000000), [10000139, 10000141]) 
+1

두 중첩 된 루프 : 당신은 jasonharper 지적대로 연속 소수 사이의 g에 동일한 최초의 델타가 발생할 때, 당신이 할 필요가 중지되고, 오름차순으로 그들을 통해 작업 할 수 있습니다 소수는 이것을 무시 무시하게 만듭니다. 한 번 반복하고 다음 번호가 정확히 g만큼 다른지 확인하십시오. – jasonharper

답변

0

list에 소수를 왜 저장해야하나요? 한 번에 하나씩 만 기억하면됩니다. 의리스트를

def gap(g, n, m): 
    previous_prime = None 
    for candidate in range(n, m + 1): 
     if all(candidate % factor for factor in range(2, int(candidate ** 0.5) + 1)): 
      if previous_prime is not None and candidate - previous_prime == g: 
       return [previous_prime, candidate] 
      previous_prime = candidate 
+0

많은 감사, 이것은 아름답게 작동합니다! 나는 내 "작은 단계로 나누십시오"에 너무 많이 갇혀 있었다고 생각합니다. CodeWars에 대한이 약간의 코드에 많은 시간을 할애 해 주셔서 감사합니다. – ApRax