Tipăriți numere prime într-un interval dat folosind C++ STL

Generați toate numerele prime între două numere date. Sarcina este să tipăriți numere prime din acel interval. The Sita lui Eratosthenes este una dintre cele mai eficiente moduri de a găsi toate numerele prime mai mici decât n unde n este mai mic de 10 milioane sau cam asa ceva. Exemple:

  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 

Recomandat: Vă rugăm să rezolvați problema PRACTICA mai întâi înainte de a trece la soluție.

Ideea este să folosiți Sieve of Eratosthenes ca subrutină. În primul rând, găsiți numere prime în intervalul de la 0 până la început și stocați-le într-un vector. În mod similar, găsiți numere prime în intervalul de la 0 la sfârșit și stocați într-un alt vector. Acum luați diferența de set a doi vectori pentru a obține răspunsul necesar. Eliminați zerourile suplimentare dacă există în vector.

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  ;   }   

Ieșire
53 59 61 67 71 73 79 83 89 97  

Complexitatea timpului: O(NlogN) unde N este diferența dintre intervale.
Spatiu auxiliar: O(N) pentru a stoca vectorul boolean.

 

Creați un test