要编写程序选出质数,可以采用以下几种方法:
基本判断法
遍历从2到N-1的所有整数,判断N是否能被这些数整除。如果能被整除,则N不是质数;如果都不能整除,则N是质数。这种方法的时间复杂度为O(N^2),效率较低,尤其是对于较大的N。
优化遍历法
由于质数除了2以外都是奇数,因此可以只遍历奇数进行判断。这样可以减少一半的判断次数。
进一步优化是只遍历到N的平方根,因为如果N有一个大于平方根的因数,那么它必定还有一个小于等于平方根的因数。
埃氏筛法
埃氏筛法是一种高效的质数筛选算法。它的基本思想是从2开始,将每个质数的倍数标记为非质数。具体步骤如下:
初始化一个长度为N+1的数组,用来表示从2到N的所有数,初始都标记为质数。
从2开始遍历数组,若当前数字未被标记为非质数,则将其所有倍数标记为非质数。同时,每次标记后,不需要重复判断它的倍数。
遍历完整个数组后,剩下的未被标记为非质数的数字即为质数。
输入两个整数,输出之间的所有质数
提示用户输入两个正整数,编程求出介于这两个数之间的所有质数并打印输出。可以通过遍历从输入的最小值到最大值之间的所有整数,并使用上述方法判断每个数是否为质数来实现。
示例代码(使用埃氏筛法)
```cpp
include include include void sieveOfEratosthenes(int n) { std::vector isPrime = false; isPrime = false; for (int i = 2; i <= std::sqrt(n); ++i) { if (isPrime[i]) { for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } } } for (int i = 2; i <= n; ++i) { if (isPrime[i]) { std::cout<< i << " "; } } std::cout << std::endl; } int main() { int start, end; std::cout << "请输入开始的整数值: "; std::cin >> start; std::cout << "请输入结束的整数值: "; std::cin >> end; std::cout << "介于 " << start << " 和 " << end << " 之间的质数有: "; sieveOfEratosthenes(end); return 0; } ``` 示例代码(输入两个整数,输出之间的所有质数) ```cpp include void printPrimesInRange(int start, int end) { for (int i = start; i <= end; ++i) { if (isPrime(i)) { std::cout<< i << " "; } } std::cout << std::endl; } bool isPrime(int n) { if (n <= 1) return false; if (n == 2) return true; if (n % 2 == 0) return false; for (int i = 3; i <= std::sqrt(n); i += 2) { if (n % i == 0) { return false; } } return true; } int main() { int start, end; std::cout << "请输入开始的整数值: "; std::cin >> start; std::cout << "请输入结束的整数值: "; std::cin >> end; std::cout << "介于 " << start << " 和 " << end << " 之间的质数有: "; printPrimesInRange(start, end); return 0; } ``` 这两种方法