质数有一个特点,就是它总是等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。
如果n是质素,那么n肯定是在6x的两侧,也肯定这个数不是2,3的倍数,那么这个数只剩下这么两种可能:可以被分解成(6x-1)(6y-1),(6x-1),(6y+1),(6x+1)(6y-1),(6x+1)(6y+1)这四种式子,或者是不能被分解。
所以我们可以先判断n对6取余结果是否为1或5。如果成立,建立循环,从6开始,再对n不能被6x+1或者6x-1整除,则n是素数。{ 其中 6x<= sqrt(n) }
#include <stdio.h>
#include <math.h>
bool isPrime(int n);
int main(void)
{
int n;
printf("%s", "Please input the number:");
scanf_s("%d", &n);
if (isPrime(n))
{
printf("%d是素数", n);
}
else
{
printf("%d不是素数", n);
}
}
bool isPrime(int n)
{
// 1不是素数;2、3是素数
if (n < 4)
{
return n > 1;
}
// 素数肯定是 6X+1 或者 6X+5
if (n % 6 != 1 && n % 6 != 5)
{
return false;
}
// 对 6X+1 和 6X+5 项进行判定
for (int i = 5; i < sqrt(n); i = i + 6)
{
if (n % i == 0 || n % (i + 2) == 0)
{
return false;
}
}
return true;
}