相信大家在学习的过程中,时不时就会遇到判断素数的问题。今天就让我们来讨论讨论这个有趣的数学问题,看看如何更高效的来解决它吧!

在刚开始接触到这个问题时,我只想到了利用一个循环去在目标数的全部范围内一个一个进行判断的方法。在了解了一些有关素数的知识后,就只用查找到目标数的平方根了。不过查找的效率还是有些低,接下来的两个方法可以更加高效的解决这个问题。

一.加长步数
素数就是只能被1和其自身整除的整数。现把判断素数的问题分成两个部分:5之前,5和5之后。
对于5之前,一共只有2和3两个素数。
对于5和5之后,让我们来分析一下其规律。
对于5和5之后的数可以分解成如下形式:
6n - 1, 6n,6n + 1,6n + 2,6n + 3,6n + 4,6n + 5,6(n + 1)
6n,6n + 2,6n + 3,6n + 4都有对应的数可以将其整除。所以素数就只可能出现在6n的前后。只需要判断这些数便可以确定目标数是否是素数了。

代码实现:

bool isprime(int n)
{if (n <= 3)return n > 1;//如果目标数不在6的前后则一定不是素数if (n % 6 != 1 && n % 6 != 5)return false;//增长每次判断的步数,增加效率,判断到目标数的平方根for (int i = 5; i <= sqrt(n); i += 6)if (n % i == 0 || n % (i + 2) == 0)//如果目标数可以被6前后的数整除,便不是素数return false;return true;
}

二.素数筛(简化版)
现在让我们来换一个思路考虑这个问题。刚刚是先得到一个目标数,然后再对其进行判断。我们也可以在得到目标数之前就将一段范围内的每一个数是否是素数判断出来,并用数组将结果记录下来。在得到目标数之后,只需要直在数组中进行查找即可。
利用布尔数组记录判断结果。不过在使用其记录结果之前,我们可以先将其中的每个奇数项的结果设置为真,每个偶数项都结果都记录为假。接下来便是判断每一个奇数是否是素数了。如果某个奇数为素数,则将其的倍数的判断结果都设置为假。在完成全部的判断后,我们就到查找的依据啦。

代码实现:

#include <iostream>
#include <cmath>
using namespace std;const int N = 10000;
bool prime[N + 1] = {false, false, true};
//注意这里数组长度的声明,如果为N则会有一个数的真假无法保存导,致程序运行崩溃。bool isprime(int);//使用加长步数的方法进行判断int main()
{int i, j;for (i = 3; i <= N; i++)//数组初始化(严格上说不叫初始化,感觉这样说比较舒服~)if (i % 2 == 0) prime[i] = false;else prime[i] = true;for (i = 3; i <= sqrt(N); i = i + 2)if (prime[i])for (j = i + i; j < N; j += i)//将为素数的奇数的倍数的结果都设置为假(定语有些多= =)prime[j] = false;for (i = 3; i < N; i++)if (prime[i])cout << i << ' ';return 0;
}bool isprime(int n)
{if (n <= 3)return n > 1;if (n % 6 != 1 && n % 6 != 5)return false;for (int i = 5; i <= sqrt(n); i += 6)if (n % i == 0 || n % (i + 2) == 0)return false;return true;
}

好啦,关于素数判断问题的讨论就先到这里啦!上面的方法在判断大量数据是否是素数的时,可以节省大量时间。有兴趣的小伙伴可以去尝试尝试哦~

判断素数———两种高效算法相关推荐

  1. ML之回归预测:利用两种机器学习算法(LiR,XGBoost(调优+重要性可视化+特征选择模型))对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值

    ML之回归预测:利用两种机器学习算法(LiR,XGBoost(调优+重要性可视化+特征选择模型))对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值 目录 输出结果 1. ...

  2. 近似装箱问题(两种脱机算法实现)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "近似装箱问题(两种脱机算法实现)" 的idea 并用源代码加以实现: 0.2) 近似 ...

  3. 【MySQL】MySQL 两种排序算法

    1.概述 原文:高性能MySQL一书.再抄的,找得快. 无论如何排序都是-一个成本很高的操作,所以从性能角度考虑,应尽可能避免排序或者尽可能避免对大量数据进行排序. 当不能使用索引生成排序结果的时候M ...

  4. 两种不同算法的AMSR-2产品下载方法

    ** 两种不同算法的AMSR-2产品下载方法 ** AMSR-2传感器搭载于全球变化观测计划GCOM(Global Change Observation Mission)的W1卫星,于2012年5月1 ...

  5. 【计算机图形学】 圆的两种生成算法(角度微分法、Bresenham算法)

    圆的两种生成算法(角度微分法.Bresenham算法) 文章目录 1.角度微分法的原理 2.角度微分法的实现(基于matlab) 3.Bresenham 算法的原理 4.Bresenham 算法的实现 ...

  6. Linux网络编程——Day12 两种高效的并发模式

    今天继续学习高性能服务器框架,上一篇关于高性能服务器的基础知识连接如下: Linux网络编程-Day11 高性能服务器程序框架_Jane_Librastar的博客-CSDN博客https://blog ...

  7. 【字符串2】(删除公共字符、合法括号序列判断、两种排序方法、密码强度等级)

    字符串题集 1. 删除公共字符 题目描述 题目分析 C++代码 2. 合法括号序列判断 题目描述 题目分析 C++代码 3. 两种排序方法 题目描述 题目分析 C++代码 4. 密码强度等级 题目描述 ...

  8. 判断素数/质数的快速算法

    质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).--via维基百科 朴素算法: 1. def ...

  9. Sql分页两种常用算法

    今天花了两个小时,写了两种分页的算法. --not in删选法,这种方法查询某个表中前面的数据效率高 create procedure Page_proc ( @pageSize int, --页数, ...

最新文章

  1. 多文多面阐述HMM很清晰
  2. chrome出现adobe flash playe 不是最新版本
  3. zendopcache代替APC效果不错
  4. android adb shell 命令大全
  5. MQTT之mosquitto_passwd命令使用
  6. php swool协程,swoole如何实现协程
  7. 使用python对redis备份zset
  8. Linux 学习笔记_12_文件共享服务_2_FTP应用--vsftpd
  9. 数据结构 判断数组元素是否互不相同
  10. 7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句、事物处理语句和游标属性
  11. GPS、基站定位在百度地图上纠偏的解决方法
  12. RHEL7.0 防火墙入门
  13. JAVA抽象类和接口类的区别
  14. Linux内核入门(二)——用户态向内核态切换
  15. python xgboost_告别无聊循环!Python帮你自动化处理文件
  16. jdk 各版本官网下载
  17. 英语“就近原则”和“就远原则”
  18. 【原创】Structure from Motion (SfM)算法测试---3D重建简介
  19. Apple watch无法登陆网易云音乐
  20. mysql root权限_如何设置Mysql root权限

热门文章

  1. Matlab三维矩阵变换行列
  2. 姿态解算知识(三)-陀螺仪加速度计6轴数据融合
  3. VMware安装win11教程
  4. Ocelot(二)- 请求聚合
  5. 自学2年java,简历包装成2年工作经验,面试全部失败
  6. 验尸官称Debian创始人 Ian Murdock 是自杀身亡
  7. Word里面如何修图
  8. 浩方连接不上服务器无响应,sv独立客户端无法登陆服务器(sv独立客户端连接失败)...
  9. 用计算机语言表达新年快乐,用计算机语言祝福大家新年快乐!
  10. 【Proteus】:LCD1602仿真实验基于STM32CubeMX