📅  最后修改于: 2023-12-03 15:06:54.263000             🧑  作者: Mango
在程序设计中,找到给定范围内的质数是一个常见的问题。我们可以使用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中的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;
}
这个程序会要求用户输入要查询的范围,然后输出范围内的质数。