判断素数——C语言

质数有一个特点,就是它总是等于 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值