[アルゴリズム][python]プログラマー小数点を検索

5780 ワード

質問する


小数点を検索

イニシャルコード

 def solution(n):
     num_of_prime = 0
     for num in range(2, n+1):
         is_prime = True
         
         for divisor in range(2, num//2+1):
             if num % divisor == 0:
                 is_prime = False
                 break
                
         if is_prime:
             num_of_prime += 1
        
     return num_of_prime
前述したように、結果はタイムアウトしました.
条件により、nは2以上1000000以下の自然数である.
nは最大100万程度で,単純反復解の複雑さはO(n^2)であり,タイムアウトが発生する可能性がある.

問題と解決策


このブログ(画像、アルゴリズムソース)を参照し、エラトネスのふるい法を用いて解決した.

アルゴリズム#アルゴリズム#

  • 2から、素数を要求したい区間の全数をリストする.図中の灰色の矩形で囲まれた数はこれに相当する.
  • 2は少数で、右に2と書きます.
  • 自分以外の2の倍数をクリアします.
  • の残りの数の中で、3は少数なので、右側に3と書きます.(緑)
  • 自分以外の3の倍数をクリアします.
  • の残りの数のうち、5は少数なので、右に5と書きます.(青)
  • 自分以外の5の倍数をクリアします.
  • の残りの数の中で、7は少数なので、右側に7と書きます.(黄色)
  • 自分以外の7の倍数をクリアします.
  • ビット目のプロセスを繰り返し、求めた区間のすべての少数の残りを返します.
  • 図11のように² >120なので11未満の倍数だけ削除すれば十分です.

    最終コード

     def solution(n):
         nums = [False,False] + [True]*(n-1) # 0, 1 제외 나머지 소수로 간주
         for i in range(2, int(n ** 0.5)+1): # 2부터 n의 제곱근(n의 최대 약수가 n의 제곱근 이하)까지의 모든 수를 확인하며 소수를 검사
             if nums[i]: # i가 소수인 경우
                 for j in range(2*i, n+1, i): # i이후 i의 배수를 모두 소수에서 제거(False)
                     nums[j] = False
         return nums.count(True)