前言:
判断素数是编程中经常应用的实例,是编程学习的重要知识,那么下面我将介绍五种判断素数的方法。
定义:
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
简单来说就是,如果一个数只能被1和它本身整除,那么这个数就是素数。
比如:2 3 5 7 11 23…
0和1既不是素数也不是合数,2是最小的素数。

方法(一)暴力法
最简单最暴力的方法就是根据定义,判断n是不是素数,则把1~n
内所有数都遍历,若都不能整除则为素数。因为如果n为素数,则只有1和n为因数。
代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{int n,b=1;scanf("%d",&n);for(int i = 2;i < n;i++){if(n % i == 0){b = 0;  break;}}if(b == 0){ printf("%d不是素数",n); }if(b == 1){ printf("%d是素数",n);   }return 0;
}

方法(二)优化
上述方法效率极低,如果n为一万,则核心代码要跑n-2次,其实我们只需要判断2~√n个数,因为一个数如果可以因数分解(不是质数),那么分解得到的两个数一定是一个小于等于√n,一个大于等于√n,一个合数一定由两个自然数相乘,一个大于等于平方根一个小于等于平方根,并且成对存在,所以只判断前根号个。这时我们需要使用sqrt函数来求根号。
代码如下:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{int n,b=1;scanf("%d",&n);for(int i = 2;i < sqrt(n);i++){if(n % i == 0){b = 0;   break;}}if(b == 0){  printf("%d不是素数",n); }if(b == 1){  printf("%d是素数",n); }return 0;
}

方法(三)孪生素数法
结论1:
当n>=5时,不在6x(x≥1)两侧的肯定不是素数,但在6x(x>=1)两侧的并不是一定就是素数。意思6x-1和6x+1可能为素数。

证明:

当n>=5时,若n为素数,n一定出现在6x(x>=1)的两侧。

6x-2 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1)…

观察得: 6x-2 = 3(x-1),6x = 2(3x),6x+2 = 2(x+1) …显然他们都不是素数

所以当n>=5时,素数一定在6x两边。

但是当x = 9时,6(x+1) = 55,可以被5整除,所以6x两侧不一定是素数。

结论2:
若n≥6且n-1和n+1为孪生素数,那么n一定是6的倍数。

证明:
因为孪生素数是差值为2的相邻素数。所以n-1和n+1是素数(小结论1)

所以 n-1和n+1一定是奇数,则n是偶数,所以n是2的倍数 (小结论2)

我们再假设n不是3的倍数,则n = 3x+1 或 n = 3x+2,

如果n = 3x+1,则n-1=3x,n-1可能为偶数,与小结论1违背

如果n = 3x+2,则n+1=3(x+1),n+1可能是偶数,与小结论2违背

所以n不是3的倍数不成立,

所以n是3的倍数,又结合小结论2:

n是一定是6的倍数,所以代码增量为6,再判断n+1和n-1是否可以
于是乎代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int su(int n){if(n < 5){if(n == 2 || n == 3) return 1;else  return 0;}else {if(n%6!=1 && n%6!=5)return 0;else {for(int i=5;i<=sqrt(n);i+=6){if(n%i==0 || n%(i+2)==0)return 0;}return 1;}}
}
int main()
{int n,b;scanf("%d",&n);b = su(n);if(b == 0){  printf("%d不是素数",n); }if(b == 1){  printf("%d是素数",n);   }return 0;
}

方法(四)埃筛法
埃筛很简单,因为素数只能被1或者它本身整除,所以一个数的倍数一定不是素数,下面举个栗子:

2 为素数,则4 6 8 10 12 14 16等都不是素数

如此简但,直接上代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{int n,i,j;scanf("%d",&n);int vis[100000]={1,1};//0和1不是素数其他先默认为0for(i=2;i<100000;i++){if(vis[i]==0){for(j=i+i;j<10000;j+=i){vis[j]++;}}}if(vis[n]==0)printf("%d是素数",n);else printf("%d不是素数",n);return 0;
}

方法(五)欧式筛法
欧式筛法是埃筛的改进,相信大家一定注意到了埃筛的小问题
当i = 2时 我们遍历了4 6 8 10 12
当i = 3时 我们遍历了6 9 12 15

我们发现了6和12被重复筛出,这样的例子数不胜数,大大降低了效率

现在我们伟大的欧拉函数来了,数学的魅力就这里绽放

1:任何一个合数都可以分解成一个素数×一个数

2:i = m * n,m是最小质因子(素数=质数)

若n为合数,n= x*y,x是一个质数,且x>m

则i = mn = mxy = xmy,且my = k.

则i = x*k,且 x>m

说明一个合数与一个质数的乘积,可以表示为一个更大的合数和一个更小的质数的乘积。

代码如下:
输入一个n,打印出以内所有素数。

#include<stdio.h>
#include<stdlib.h>
int su[1000000];
int prime[10000];
int main()
{int i,j,n,s=0;scanf("%d",&n);for(i=2;i<=n;i++){if(su[i] == 0){prime[++s] = i ;}for(j=1;j<=s && i*prime[j]<=n;j++){su[i*prime[j]] = 1 ;if(i%prime[j] == 0) break;}}for(i=1;i<=s;i++){printf("%d ",prime[i]);}return 0;
}

判断素数的五种方法最全埃筛素数欧筛素数孪生素数相关推荐

  1. java求互质数_判断互质数的五种方法

    一. 概念判断法 公约数只有1的两个数叫做互质数.根据互质数的概念可以对一组数是否互质进行判断.如:9和11的公约数只有1,则它们是互质数. 二. 规律判断法 根据互质数的定义,可总结出一些规律,利用 ...

  2. 素数(质数)判断的五种方法

    素数判断的五种方法 素数判断是我们写程序过程中经常遇见的一个问题,于是今天我简单地整理一下常用的素数判断的方法. 素数的介绍 素数定义 质数(prime number)又称素数,有无限个.一个大于1的 ...

  3. php判断数组的值是否为空,PHP判断数组是否为空的常用方法(五种方法)

    本文介绍了PHP开发中遇到的数组问题,小编在这里给大家总结了5中方法关于php判断数组是否为空问题,需要的朋友参考下 本文介绍了PHP开发中遇到的数组问题,这里介绍了判断PHP数组为空的5种方法,有需 ...

  4. python脚本判断一个数是否为素数的几种方法

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  5. python中判断一个数是否为素数_【转载】Python脚本判断一个数是否为素数的几种方法...

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  6. C语言判断素数的两种方法

    C语言判断素数的两种方法 素数又称质数.所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除. 思路1):因此判断一个整数m是否是素数, ...

  7. php判断质数,php如何判断是否为素数?判断素数的三种方法(代码示例)

    本篇文章给大家带来的内容是介绍php如何判断是否为素数?判断素数的三种方法(代码示例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 什么是素数? 质数又称素数.一个大于1的自然数 ...

  8. 3.js中判断数组中是否存在某个对象/值,判断数组里的对象是否存在某个值 的五种方法 及应用场景|判断数组里有没有某对象,有不添加,没有则添加到数组

    3.js中判断数组中是否存在某个对象/值,判断数组里的对象是否存在某个值 的五种方法 及应用场景 一.当数组中的数据是简单类型时: 应用js中的indexof方法:存在则返回当前项索引,不存在则返回 ...

  9. 第二十二章:求解素数的N种方法

    求解素数的N种方法 一.质数和合数 质数: 质数又称**素数**.指在一个大于 1的自然数中,除了 1和此整数自身外,不能被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为质数. ...

最新文章

  1. can't find a register in class `GENERAL_REGS' while reloading `asm'
  2. 白话Elasticsearch24- 深度探秘搜索技术之TFIDF算法/向量空间模型算法/lucene的相关度分数算法
  3. hdu 4597 Play Game(记忆化搜索)
  4. boost之lexical_cast
  5. 没有bug队——加贝——Python 练习实例 1,2
  6. h3c配置snmp配置命令_配置单元命令
  7. 如何更好对数据做分析
  8. Linux服务器配置Redis并启用PHP支持
  9. 算法:顺时针遍历矩阵 螺旋矩阵转换为顺时针列表spiral matrix
  10. zerotier使用教程_ZeroTier 初阶教程
  11. visual svn server安装失败
  12. 什么是微信二次开发,如何进行微信二次开发?
  13. 新支点“B4G+5G”聚合路由器多链路图传技术巩固安防监控行业
  14. Openwrt pppoe demand拨号问题
  15. 【计算机网络】计算机网络核心知识点
  16. 华硕笔记本电脑计算机专业,超详细华硕笔记本电脑重装系统图文教程
  17. CDA Level1知识点总结之总论
  18. 洛谷:P5707 【深基2.例12】上学迟到
  19. vsomeip源码梳理 -- Event订阅流程
  20. 派斯宝多尼斯荣登纳斯达克大屏 闪耀国际舞台

热门文章

  1. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.5 多段线、多边形
  2. idea运行web项目
  3. 惠普DL388G9服务器安装双系统无法启动问题
  4. 百度测试开发实习生技术面总结笔记
  5. Phaser3之 anims
  6. java8 list max_Java 在List 上使用.max()和.stream()
  7. 非校园网免费下载国内各大数据库文献方法
  8. 高通Ziad Asghar:AI处理的重心从云端向边缘侧转移,智能手机是最佳平台 | MEET 2023...
  9. ARMv7的Cortex系列微处理器技术特点
  10. 微信小程序打开微信公众号中的文章实战教程