质数(素数)的判断 c++

素数(质数)

定义

  1. 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数
  2. 0和1既不是质数也不是合数,最小的质数是2。
  3. 素数是构成所有正整数的基本构造元素,任何正整数n都可以表示成素数的乘积(并具有唯一性):image-20210520162919181

常用定理

定理1:当n≥5时,如果n为素数,那么n%6=1或n%6=5。即n一定出现在6x(x≥1)的两侧。
定理2:若n≥6且n-1和n+1为孪生素数,那么n一定是6的倍数。

质数判断的优化

优化1:对数m判断其是否为质数,判断其能否被[2, sqrt(m)]范围内的数字所整除即可,而不必时[2, m]的范围。

优化2:对优化1进行具体化,实际不用从2开始,直接从5开始,原因如下:

  1. 因为6x两边的数一定是奇数,那么一定不能被2整除,故而不用考虑2。

  2. 由于6x+1或者6x-1除以3,一定是2x+1/3或者2x-1/3,也不可能被3整除,故而不考虑3.

  3. 由于4是偶数,且6x+1和6x-1一定是奇数,即奇数一定不能被4这个偶数除尽,故而不考虑4。

综上,从5开始判断,也就是说判断范围是[5, sqrt(m)]。

优化3:在优化2的基础上,在范围[5, sqrt(m)]内,步长也不用是1,可以设置为6,原因如下:

在这里插入图片描述

代码

/*本程序判断是否为一个数是否为质数(素数)*/
include<bits/stdc++.h>
using namespace std;

bool isPrime(int n) {
	if(n<=3) return n>1;
	if(n%6!=1 && n%6!=5) return false;  //如果不在6倍数附近,肯定不是素数
 
	for(int i=5; i<=sqrt(n); i+=6)  //但在6倍数附近并不是一定就是素数,需判断
		if(n%i==0 || n%(i+2)==0) return false;
	return true;
}
 
int main() {
	int x;
	cin>>x;
	if(isPrime(x))
		cout<<"This is a prime."<<endl;
	else
		cout<<"This is not a prime."<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值