📜  使用STL |给定范围内的质数|套装2

📅  最后修改于: 2021-04-24 20:49:52             🧑  作者: Mango

生成两个给定数字之间的所有质数。任务是打印该范围内的质数。 Eratosthenes的筛子是查找所有小于n的素数(其中n小于1000万左右)的最有效方法之一。

例子:

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

想法是使用Eratosthenes筛子作为子例程。我们已经讨论了使用STL在给定范围内的质数中的一种实现。套装1

  1. 查找从0到结束范围内的素数,并将其存储在向量中
  2. 使用二进制搜索找到小于起始值的元素索引。我们在STL中使用lower_bound()。
  3. 从向量的开头擦除元素到该索引。我们使用向量delete()

中提琴!向量包含从开始到结束的素数。

// C++ program to print all primes
// in a range using Sieve of Eratosthenes
#include 
#include 
#include 
#include 
using namespace std;
  
#define all(v) v.begin(), v.end()
typedef unsigned long long int ulli;
  
vector 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 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 ans;
    for (int i = 0; i < n; i++)
        if (prime[i])
            ans.push_back(i);
    return ans;
}
  
vector sieveRange(ulli start, ulli end)
{
    // find primes from [0..end] range
    vector ans = sieve(end);
  
    // Find index of first prime greater than or
    // equal to start
    // O(sqrt(n)loglog(n))
    int lower_bound_index = lower_bound(all(ans), start) - 
                                              ans.begin();
  
    // Remove all elements smaller than start.
    // O(logn)
    ans.erase(ans.begin(), ans.begin() + lower_bound_index);
  
    return ans;
}
  
// Driver Program to test above function
int main(void)
{
    ulli start = 50;
    ulli end = 100;
    vector ans = sieveRange(start, end);
    for (auto i : ans)
        cout << i << ' ';
    return 0;
}
输出:
53 59 61 67 71 73 79 83 89 97