试除法判断素数优化【C语言】

代码引用

cpp 复制代码
int is_prime(int num) {
	if (num <= 1) return 0;
	if (num == 2 || num == 3) return 1;
	if (num % 2 == 0 || num % 3 == 0) return 0;
	for (int i = 5; i * i <= num; i += 6) {
		if (num % i == 0 || num % (i + 2) == 0) return 0;
	}
	return 1;
}

一、数学原理

所有大于3的素数都可以写成 6k ± 1

(除2和3外所有素数都在6的邻域内)

为什么呢?因为所有整数都可以表示为6k、6k+1、6k+2、6k+3、6k+4、6k+5。其中,6k、6k+2、6k+4都是偶数,已经被num%2排除了。6k+3则是3的倍数,已经被num%3排除了。剩下的只有6k+1和6k+5(也就是6k-1)。

二、优化原理

1. 先排除特殊情况

cpp 复制代码
if (num <= 1) return 0; // 1以下的数不是素数
if (num == 2 || num == 3) return 1; // 2和3是素数
if (num % 2 == 0 || num % 3 == 0) return 0; // 能被2或3整除的,肯定不是素数
  • 这些判断快速排除一些明显不是素数的情况,尤其是偶数和能被3整除的数,避免后续多余的计算。

2. 只检查到平方根

cpp 复制代码
for (int i = 5; i * i <= num; i += 6)
  • 只需要检查到 sqrt(num) ,因为一个数如果有因子大于 sqrt(),对应的另一个因子必小于 sqrt()。

3. 以6的倍数间隔进行遍历

  • 这是优化的关键:所有素数(除了2和3)都可以写成形式为 6k ± 1 的数(其中k为整数)。

  • 这段代码只检查形如6k-1(即i)和6k+1(即i+2)的数是否能整除 num。

简单总结:

这个算法利用了素数的数学性质(除2和3外所有素数都在6的邻域内),通过跳过非潜在因子(非6k±1的数),在保留正确性和完整性的基础上,大大优化了判断速度。

相关推荐
小O的算法实验室16 分钟前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
可乐ea1 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测
上位机妹子1 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
心中有你02141 小时前
【路径规划】A*寻路算法最通俗易懂讲解(C语言完整实现+详细注释)
c语言·开发语言·算法
papaofdoudou2 小时前
初中数学-整数整除判定法全解:从 2 到 19 的方法、依据与证明
算法
让学习成为一种生活方式2 小时前
啤酒花基因组与重测序--Nature Communications
人工智能·算法
l1t3 小时前
DeepSeek总结的OpenZL压缩变换器
c++·算法
想吃火锅10053 小时前
【leetcode】238.除了自身以外数组的乘积js
javascript·算法·leetcode
坤坤子吖3 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法
CQU_JIAKE3 小时前
10.1[A]2267,磐久UMX【上下文128K,KVCache部分]
算法