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

📅  最后修改于: 2023-12-03 15:06:54.263000             🧑  作者: Mango

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

在程序设计中,找到给定范围内的质数是一个常见的问题。我们可以使用STL(标准模板库)来实现这个问题,以及处理切实可行的工作方式和实现。

算法

给定一个数x,如果又能被2整除又能被3整除,那么该数必然能被6整除。 我们可以将判断6的倍数的条件替换为判断2、3,即当x被2、3其中一个数整除,则return false,否则return true。

bool isPrime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
  
    if (n%2 == 0 || n%3 == 0) return false;
  
    // 判断是否能被6整除,除了2、3
    for (int i=5; i*i <= n; i+=6) {
        if (n%i == 0 || n%(i+2) == 0) {
            return false;
        }
    }
  
    return true;
}
STL实现

我们可以使用STL中的std::vector容器和std::copy_if算法来实现找到给定范围内的质数。std::vector保存找到的质数,std::copy_if将vector中大于等于2的数传递给isPrime函数,如果是质数,就保存在结果vector中。

std::vector<int> findPrimes(int start, int end) {
    std::vector<int> primes;
  
    // 将给定范围内的数存储在初始vector中
    std::vector<int> nums(end-start);
    std::iota(nums.begin(), nums.end(), start);
  
    // 将是质数的数字存储在结果vector中
    std::copy_if(nums.begin(), nums.end(), std::back_inserter(primes), isPrime);
  
    return primes;
}
示例代码

下面是一个示例代码,展示了如何使用上述函数来找到给定范围内的质数。

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

bool isPrime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
  
    if (n%2 == 0 || n%3 == 0) return false;
  
    for (int i=5; i*i <= n; i+=6) {
        if (n%i == 0 || n%(i+2) == 0) {
            return false;
        }
    }
  
    return true;
}

std::vector<int> findPrimes(int start, int end) {
    std::vector<int> primes;
  
    std::vector<int> nums(end-start);
    std::iota(nums.begin(), nums.end(), start);
  
    std::copy_if(nums.begin(), nums.end(), std::back_inserter(primes), isPrime);
  
    return primes;
}

int main() {
    int start, end;
    std::cout << "请输入要查询的起始数和结束数:\n";
    std::cin >> start >> end;
  
    std::vector<int> primes = findPrimes(start, end);
  
    std::cout << "查询结果为:\n";
    std::copy(primes.begin(), primes.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
  
    return 0;
}

这个程序会要求用户输入要查询的范围,然后输出范围内的质数。