logo

C++ STL을 사용하여 주어진 범위의 소수를 인쇄합니다.

주어진 두 숫자 사이의 모든 소수를 생성합니다. 작업은 해당 범위의 소수를 인쇄하는 것입니다. 그만큼 에라토스테네스의 체 n이 1,000만개 정도 작은 경우 n보다 작은 모든 소수를 찾는 가장 효율적인 방법 중 하나입니다. 예:

  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부터 끝까지 범위의 소수를 찾아 다른 벡터에 저장합니다. 이제 필요한 답을 얻기 위해 두 벡터의 차집합을 취합니다. 벡터에 추가 0이 있으면 제거합니다.

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+1true);    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 startulli 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(startend);  for (auto i:ans)  cout<<i<<' ';  return 0; } 

산출
53 59 61 67 71 73 79 83 89 97 

시간 복잡도: O(NlogN) 여기서 N은 간격 간의 차이입니다.
보조 공간 : O(N)은 부울 벡터를 저장합니다.



 

퀴즈 만들기