最近在学习乔林老师的C++教学视频。在算法一节有关于判断素数的内容,感觉挺有收获的,就想着跟大家分享一下。现在,让我们一起来学习吧。

1.面对素数合数检验,我们很容易就联想到暴力穷举的算法。
例如以下例程:

/*解法一*/
bool IsPrime_1(unsigned int n)
{unsigned int i = 2;while (i<n){if (n%i == 0){return false;}i++;}return true;
}

2.接下来,我们给这个算法改进下,提高它的效率。

分析:
如果这个数是合数,那么这个数一定可以写成n=p*q的形式。
这个数一定有一个小于或者等于根号n的因子,那么可以改判断条件i <= (unsigned int)sqrt(n);
现在程序循环次数由2 ~ n -1,直接降低到2 ~ 根号n。效率大大提高。

bool IsPrime_2(unsigned int n)
{unsigned int i = 2;while (i <= (unsigned int)sqrt(n)){if (n%i == 0){return false;}i++;}return true;
}

3.继续来改进这个小算法。

分析:
如果这个数是合数,那么这个数整除2。
接下来从3开始除,不用除以偶数,只除以奇数就可以去遍历。
效率又可以比上一个版本提高一倍。

bool IsPrime_3(unsigned int n)
{unsigned int i = 3;if (n%i == 0){return false;}while (i <= (unsigned int)sqrt(n)){if (n%i == 0){return false;}i += 2;}return true;
}

4.难以发现的隐含bug。

分析:
sqrt(),会得到一个浮点数的结果。
假设:该数字为完全平方数121,经过sqrt()开根号后就是11.000000000。
但是我们学过计算机组成原理都知道,浮点数在计算机内部存储有误差。
那11.000000000就可能被表示为11.000000001。或者10.999999999。
如果是前一种还好,如果是后一种程序就会出大问题咯。因为10.999999999
转换成unsigned int时,会把小数部分省掉,就是10。循环标准由11变成10,当然会出问题。
我们就给它+1来解决这个隐含的bug。

bool IsPrime_4(unsigned int n)
{unsigned int i = 3;if (n%i == 0){return false;}while (i <= (unsigned int)sqrt(n) + 1){if (n%i == 0){return false;}i += 2;}return true;
}

5.最后的优化。

分析:
我们现在思考,函数传入的参数n是个定值,那么我们只用求一次sqrt(n)就够了,
没必要每次循环都求一个sqrt(n)。这样再也不用重复计算啊sqrt(n)了, 只在进入while()之前
计算一次就够了。这样效率又一次大大提高!

bool IsPrime_5(unsigned int n)
{unsigned int i = 3, t = (unsigned int)sqrt(n) + 1;if (n%i == 0){return false;}while (i <= t){if (n%i == 0){return false;}i += 2;}return true;
}

ok,完工。这个小小的算法,竟然可以优化这么多内容,感觉程序的世界真的是奇妙无比。

C++判断一个大于2的整数是否是素数相关推荐

  1. 计算区间素数和,杨老师正在上《离散数学》课程的“数论”内容,讲授素数的知识。素数又称为质数。一个大于1的整数p是素数,当且仅当p只能被1和自身整除。很显然,2是最小的素数。他想设计一个程序

    杨老师正在上<离散数学>课程的"数论"内容,讲授素数的知识.素数又称为质数.一个大于1的整数p是素数,当且仅当p只能被1和自身整除.很显然,2是最小的素数.他想设计一个 ...

  2. 【Python】从键盘输入一个大于1的整数N,判断是否为素数

    n=input("请输入一个大于1的整数N:") n=int(n) sign=True for i in range(2,n):if n%i==0:sign=Falsebreak ...

  3. 输入一个大于3的整数n,判定它是否为素数。例题5.9

    题目 本题是谭浩强<C程序设计课后习题>例题5.9. 题目:输入一个大于3的整数n,判定它是否为素数. 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步.--来自考研路上的l ...

  4. python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...

    #include //让n被i除(i的值从2到n-1) int main() { int n,i; printf("please enter a integer number,n=?&quo ...

  5. js判断一个数字是否是整数

    首先判断这个数字是不是number var a=2; console.log(!isNaN(a)) 再使用余数运算判断 任何整数都会被1整除,即余数是0.利用这个规则来判断是否是整数. var a=4 ...

  6. C语言学习之输入一个大于三的值判断是否为素数

    C语言学习之输入一个大于三的值判断是否为素数 方法一 #include <stdio.h> int main(){int number,x; //定义变量printf("请输入一 ...

  7. c++输入一个整数判断是否为完全平方数_matlab判断一个整数是完全平方数

    (C语言c++)判断一个数是否是 完全平方数的 整数倍 #include#includeint ispow(int x){    int& 用c编判断一个数是否是完全数 #include#in ...

  8. python给定一个整数n、判断n是否为素数_Python判断一个整数是否为素数

    素数的定义:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 即只能被1和自己本身整除的数 思路及步骤 给定一个大于2的整数n 令i=2 用n除i,得到余数r 判断r==0是否成立,如 ...

  9. python判断正整数是否为素数_Python判断一个整数是否为素数

    素数的定义:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 即只能被1和自己本身整除的数 思路及步骤 给定一个大于2的整数n 令i=2 用n除i,得到余数r 判断r==0是否成立,如 ...

最新文章

  1. Eval和Bind的区别
  2. 悟透LoadRunner - 什么是性能测试?
  3. 临床科研设计的主要内容
  4. PHP的composer清除缓存
  5. ucore-lab1-练习5report
  6. Flink算子(Filter、KeyBy、Reduce和Aggregate)
  7. faiss python安装_如何在ubuntu 18.04上安装faiss GPU
  8. petshop4.0 详解之五(PetShop之业务逻辑层设计)(转帖)
  9. php中的each()用法和list()用法
  10. infortrend ESDS RAID6故障后的数据恢复方案
  11. 《深入理解java虚拟机》 精华总结
  12. Windows Server 2008 R2更新永恒之蓝 补丁包方法
  13. HFSS印刷偶极子天线(2)
  14. 总结2020:5个月出版两本书,日更公众号是一种怎样的体验?
  15. tplink怎么进去_怎么进入TP-Link路由器设置界面?
  16. 从0到1CTFer成长之路环境搭建详细教程
  17. Linux查看服务器SN序列码
  18. matlab的dc程序,基于MATLAB的数字式DC/DC开关电源系统建模
  19. ios开发:UINavigationController反方向滑动push
  20. ubuntu上使用certbot安装ssl证书到nginx

热门文章

  1. 数据众包平台Premise持续向美军提供情报数据
  2. Nginx+Tomcat集群:搭建Jpress(三)
  3. TRUNCATE,DORP,DELETE
  4. 快狐未能连接服务器,航海王强者之路好友福袋开启详细介绍_快狐快狐视频app...
  5. Leecode DFS深度优先搜索
  6. Vuex Actions使用
  7. Maven基础-认识Maven
  8. 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输
  9. Launcher 记录自定义桌面
  10. 生活的压力和生命的尊严,哪个更重要?