C++ STL を使用して、指定された範囲の素数を出力します。

指定された 2 つの数値の間にあるすべての素数を生成します。タスクは、その範囲内の素数を出力することです。の エラトステネスのふるい これは、n が 1000 万程度より小さい場合に、n より小さいすべての素数を見つけるための最も効率的な方法の 1 つです。例:

  Input :   start = 50 end = 100   Output :   53 59 61 67 71 73 79 83 89 97   Input :   start = 900 end = 1000   Output :   907 911 919 929 937 941 947 953 967 971 977 983 991 997 

推奨: で解決してください 練習する 解決策に進む前に、まず。

アイデアは、エラトステネスのふるいをサブルーチンとして使用することです。まず0から先頭までの範囲で素数を見つけてベクトルに格納します。同様に 0 から末尾までの範囲で素数を見つけて、別のベクトルに格納します。次に、2 つのベクトルの差集合を取得して、必要な答えを取得します。ベクトル内に余分なゼロがある場合は削除します。

CPP
   // C++ STL program to print all primes   // in a range using Sieve of Eratosthenes   #include       using     namespace     std  ;   typedef     unsigned     long     long     int     ulli  ;   vector   <  ulli  >     sieve  (  ulli     n  )   {      // Create a boolean vector 'prime[0..n]' and      // initialize all entries it as true. A value      // in prime[i] will finally be false if i is      // Not a prime else true.      vector   <  bool  >     prime  (  n  +  1    true  );          prime  [  0  ]     =     false  ;      prime  [  1  ]     =     false  ;      int     m     =     sqrt  (  n  );      for     (  ulli     p  =  2  ;     p   <=  m  ;     p  ++  )      {          // If prime[p] is not changed then it      // is a prime      if     (  prime  [  p  ])      {      // Update all multiples of p      for     (  ulli     i  =  p  *  2  ;     i   <=  n  ;     i     +=     p  )      prime  [  i  ]     =     false  ;      }      }      // push all the primes into the vector ans      vector   <  ulli  >     ans  ;      for     (  int     i  =  0  ;  i   <  n  ;  i  ++  )      if     (  prime  [  i  ])      ans  .  push_back  (  i  );      return     ans  ;   }   // Used to remove zeros from a vector using   // library function remove_if()   bool     isZero  (  ulli     i  )   {      return     i     ==     0  ;   }   vector   <  ulli  >     sieveRange  (  ulli     start    ulli     end  )   {      // find primes from [0..start] range      vector   <  ulli  >     s1     =     sieve  (  start  );          // find primes from [0..end] range      vector   <  ulli  >     s2     =     sieve  (  end  );      vector   <  ulli  >     ans  (  end  -  start  );          // find set difference of two vectors and      // push result in vector ans      // O(2*(m+n)-1)      set_difference  (  s2  .  begin  ()     s2  .  end  ()     s1  .  begin  ()      s2  .  end  ()     ans  .  begin  ());      // remove extra zeros if any. O(n)      vector   <  ulli  >::  iterator     itr     =      remove_if  (  ans  .  begin  ()  ans  .  end  ()  isZero  );      // resize it. // O(n)      ans  .  resize  (  itr  -  ans  .  begin  ());      return     ans  ;   }   // Driver Program to test above function   int     main  (  void  )   {      ulli     start     =     50  ;      ulli     end     =     100  ;      vector   <  ulli  >     ans     =     sieveRange  (  start    end  );      for     (  auto     i  :  ans  )      cout   < <  i   < <  ' '  ;      return     0  ;   }   

出力
53 59 61 67 71 73 79 83 89 97  

時間計算量 : O(NlogN) ここで、N は間隔間の差です。
補助スペース: O(N) はブール値ベクトルを格納します。

 

クイズの作成