素数(质数)、判断质数与筛法

素数(质数)

质数和素数是同一个概念,都是指只能被1和自身整除的正整数。换言之,如果一个正整数大于1,且只有1和它本身这两个因数,那么这个数就是质数或素数。

判断质数

判断一个数是否为质数或素数,可以使用多种方法,下面介绍两种比较常用的方法:

试除法

对于一个大于1的整数n,如果它在2到sqrt(n)这个范围内的所有正整数中都无法被整除,那么它就是质数。其中,sqrt表示求平方根。例如,判断17是否为质数,只需要在2到4(sqrt(17)取整)之间逐一尝试,发现它不能被2、3、4整除,因此是质数。

算法详解

bool isPrime(int count) {
  if (count < 2)
    return false;
  for (int i = 2; i <= sqrt(count); i++) {
    if (count % i == 0)
      return false;
  }
  return true;
}

埃拉托斯特尼筛法

这是一种筛选法,可以用来找出一定范围内的所有质数。具体实现方法是先把所有自然数标记为未筛选,然后从2开始,将2的倍数标记为合数,接着找到标记为未筛选的最小的数,再将它的倍数标记为合数,依次进行下去,直到筛完所有小于等于目标范围的自然数。最终剩下的未被标记的数就都是质数。

举个例子,我们要找出小于等于20的所有质数。首先列出这些数:2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20。然后从2开始,把它的倍数4、6、8、10、12、14、16、18、20全部标记为合数。接着轮到3,把它的倍数6、9、12、15、18标记为合数。最后,剩下的未被标记的数就是质数:2、3、5、7、11、13、17、19。

筛法是一种高效的算法,其时间复杂度大约是O(n log log n),其中n是要筛选的范围内的自然数个数。

算法详解

void eratosthenes() {
  for (int i = 2; i < arr.size(); i++) {
    if (!arr[i]) {
      for (int j = 2; i * j < arr.size(); j++) {
        arr[i * j] = true;
      }
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容