- 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)原理(用于判断一定范围内的质数)
1 条评论
-
admin SU @ 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