1. 质数的定义

    • 质数(素数)是指在大于1的自然数中,除了1和它自身外,不能被其他自然数整除的数。例如2、3、5、7、11等都是质数。
  2. 基本的判断方法(试除法)

    • 示例代码
      #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函数判断这个整数是否为质数,并根据结果输出相应的信息。
  3. 优化的判断方法(筛法)

    • 埃拉托斯特尼筛法(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 + 1true,表示假设所有数都是质数。然后将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循环输出这些质数。

1 条评论

  • @ 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