快速判断素数的方法

做OJ的时候碰到了一个判断素数的方法,考虑到素数使用传统暴力方法比较耗时间,所以参考了以下这篇文章,做了个笔记。
https://www.cnblogs.com/IceHowe/p/11186862.html。

常规方法

素数的定义是大于1的自然数中,除了自己本身和1之外,没有其他的因数的数叫做素数或者质数。
因此常规方法就是将2~N-1的数同时与N相除,如果余数为0,则不是素数。若所有余数都是非0的,那么就是素数。代码我这里就省略了。

更有效的方法

定理1:大于5的素数,一定分布在6的倍数左右。例如 5、7;11、13;17、19…
证明:令x>=1,则所有大于5自然数可以表示为
…6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1,6(x+1)+2…
上式可以转变成
…6x-1, 6x, 6x+1, 2(3x+1),3(x+1),2(3x+2),6x+5,6(x+1),6(x+1)+1,2[3(x+1)+1]…
我们可以看到在6的倍数左边和右边的数都是无法找到其他约束的,而不在6x左右两侧的数6x+2,6x+3,6x+4都可以被2、3、2整除。
定理2:一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n)
因此我们遍历的时候,只需要遍历到小于等于sqrt(n)一侧,如果这一边没有出现因数的话,那么在大于等于sqrt(n)的一侧一定不会出现因数。
因此C++代码如下

#include<iostream>
#include<math.h>
bool prime(int num)
{
	if(num==2 || num==3) 
	return true;
	if(num%6!=1 &&num%6!=5)
	return false;

	int temp;
	temp=int(sqrt(float(num)));
	for(int i=5;i<=temp;i+=6)
	{
	if(num%i==0 || num%(i+2)==0) 
	return false;
	}
return true;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值