- C++
C++判断质数
- @ 2024-12-28 18:55:42
-
质数的定义
- 质数(素数)是指在大于1的自然数中,除了1和它自身外,不能被其他自然数整除的数。例如2、3、5、7、11等都是质数。
-
基本的判断方法(试除法)

- 示例代码
#include <iostream> #include <cmath> bool isPrime(int num) { if (num <= 1) { return false; } int sqrt_num = static_cast<int>(sqrt(num)); for (int i = 2; i <= sqrt_num; ++i) { if (num % i == 0) { return false; } } return true; } int main() { int number; std::cout << "请输入一个整数: "; std::cin >> number; if (isPrime(number)) { std::cout << number << "是质数。" << std::endl; } else { std::cout << number << "不是质数。" << std::endl; } return 0; } - 解释
- 首先包含了
<iostream>用于输入输出和<cmath>头文件用于使用平方根函数sqrt。 - 定义了
isPrime函数,它接受一个整数num作为参数。在函数内部,首先判断num是否小于等于1,如果是,则返回false,因为质数定义要求大于1。 - 然后计算
num的平方根并转换为整数类型存储在sqrt_num中。使用for循环从2开始到sqrt_num检查是否能整除num。如果发现有能整除num的数,就返回false,表示num不是质数;如果循环结束都没有发现这样的数,就返回true,表示num是质数。 - 在
main函数中,提示用户输入一个整数,使用std::cin读取这个整数,然后调用isPrime函数判断这个整数是否为质数,并根据结果输出相应的信息。
- 首先包含了
- 示例代码
-
优化的判断方法(筛法)
- 埃拉托斯特尼筛法(Sieve of Eratosthenes)原理(用于判断一定范围内的质数)
- 它的基本思想是先把(n)个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过(n)的全部合数都筛掉,留下的就是不超过(n)的全部质数。
- 示例代码(找出1到100之间的质数)
#include <iostream> #include <vector> std::vector<int> sieveOfEratosthenes(int n) { std::vector<bool> is_prime(n + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) { for (int j = i * i; j <= n; j += i) { is_prime[j] = false; } } } std::vector<int> primes; for (int i = 2; i <= n; ++i) { if (is_prime[i]) { primes.push_back(i); } } return primes; } int main() { int n = 100; std::vector<int> primes = sieveOfEratosthenes(n); std::cout << "1到" << n << "之间的质数有: "; for (int prime : primes) { std::cout << prime << " "; } std::cout << std::endl; return 0; } - 解释
- 首先包含了
<iostream>和<vector>头文件。定义了sieveOfEratosthenes函数,它接受一个整数n作为参数,用于找出1到n之间的质数。 - 在函数内部,创建了一个
std::vector<bool>类型的容器is_prime,并初始化为n + 1个true,表示假设所有数都是质数。然后将is_prime[0]和is_prime[1]设置为false,因为0和1不是质数。 - 使用外层
for循环从2开始,只要(i * i <= n),就检查is_prime[i]。如果is_prime[i]为true,表示i是质数,就使用内层for循环将i的倍数(从(i * i)开始,因为小于(i * i)的(i)的倍数已经在之前的循环中被筛掉了)都设置为false,表示这些数是合数。 - 接着创建一个
std::vector<int>类型的容器primes,用于存储质数。通过循环从2到n检查is_prime[i],如果为true,就将i添加到primes容器中。最后返回primes容器。 - 在
main函数中,调用sieveOfEratosthenes函数找出1到100之间的质数,将结果存储在primes向量中,然后使用范围for循环输出这些质数。
- 首先包含了
- 埃拉托斯特尼筛法(Sieve of Eratosthenes)原理(用于判断一定范围内的质数)
2 条评论
-
admin SU @ 2025-1-13 21:38:07

-
@ 2024-12-28 19:18:30
以下是使用C++代码实现找出一个整数数组中所有质数的几种常见方法示例,你可以根据实际需求进行选择或参考:
方法一:使用试除法判断质数(基础方法)
#include <iostream> #include <vector> #include <cmath> // 判断一个数是否为质数的函数 bool isPrime(int num) { if (num <= 1) { return false; } int sqrt_num = static_cast<int>(sqrt(num)); for (int i = 2; i <= sqrt_num; ++i) { if (num % i == 0) { return false; } } return true; } // 找出整数数组中所有质数的函数 std::vector<int> findPrimesInArray(const std::vector<int>& arr) { std::vector<int> primes; for (int num : arr) { if (isPrime(num)) { primes.push_back(num); } } return primes; } int main() { std::vector<int> arr = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; std::vector<int> result = findPrimesInArray(arr); std::cout << "数组中的质数有: "; for (int prime : result) { std::cout << prime << " "; } std::cout << std::endl; return 0; }解释:
- 首先定义了
isPrime函数,用于判断一个单独的整数是否为质数,其原理是通过试除法,从2开始到该数的平方根依次检查是否能整除这个数,如果都不能整除则是质数,返回true,否则返回false。 - 接着定义了
findPrimesInArray函数,它接受一个整数数组的引用arr作为参数,遍历数组中的每一个元素,调用isPrime函数判断每个元素是否为质数,如果是质数就将其添加到primes向量中,最后返回包含所有质数的primes向量。 - 在
main函数中,创建了一个示例整数数组arr,调用findPrimesInArray函数找出数组中的质数,将结果存储在result向量中,然后通过循环输出这些质数。
方法二:使用埃拉托斯特尼筛法(适合找出一定范围内的所有质数,可先预处理再筛选数组中的质数)
#include <iostream> #include <vector> // 埃拉托斯特尼筛法找出1到n之间的所有质数 std::vector<int> sieveOfEratosthenes(int n) { std::vector<bool> is_prime(n + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) { for (int j = i * i; j <= n; j += i) { is_prime[j] = false; } } } std::vector<int> primes; for (int i = 2; i <= n; ++i) { if (is_prime[i]) { primes.push_back(i); } } return primes; } // 找出整数数组中所有质数的函数(利用筛法预处理) std::vector<int> findPrimesInArray(const std::vector<int>& arr) { int max_num = 0; for (int num : arr) { if (num > max_num) { max_num = num; } } std::vector<int> all_primes = sieveOfEratosthenes(max_num); std::vector<int> primes_in_arr; for (int num : arr) { if (std::find(all_primes.begin(), all_primes.end(), num)!= all_primes.end()) { primes_in_arr.push_back(num); } } return primes_in_arr; } int main() { std::vector<int> arr = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; std::vector<int> result = findPrimesInArray(arr); std::cout << "数组中的质数有: "; for (int prime : result) { std::cout << prime << " "; } std::cout << std::endl; return 0; }解释:
- 先定义了
sieveOfEratosthenes函数,通过埃拉托斯特尼筛法找出1到n之间的所有质数,其原理是将范围内的数标记为是否为质数,把合数筛掉,最后收集所有质数到primes向量并返回。 findPrimesInArray函数用于找出给定整数数组中的所有质数。首先遍历数组找到数组中的最大元素max_num,然后调用sieveOfEratosthenes函数得到1到max_num之间的所有质数存储在all_primes向量中。接着再遍历数组中的每个元素,通过std::find函数查看该元素是否在all_primes向量中,如果在就将其添加到primes_in_arr向量中,最后返回primes_in_arr向量作为数组中所有质数的结果。- 在
main函数中同样是创建示例数组,调用findPrimesInArray函数获取质数并输出。
这两种方法都可以实现找出整数数组中的所有质数,方法一相对简单直接,每次判断一个数是否为质数;方法二则对于范围不大且多次查找质数的情况可能更高效,因为它提前预处理了一定范围内的质数情况。
- 首先定义了
- 1