试除法判断素数优化【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的数),在保留正确性和完整性的基础上,大大优化了判断速度。

相关推荐
一只码代码的章鱼7 分钟前
Spring的 @Validate注解详细分析
前端·spring boot·算法
邹诗钰-电子信息工程10 分钟前
嵌入式自学第二十一天(5.14)
java·开发语言·算法
↣life♚1 小时前
从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation & Promptable Segmentation
人工智能·深度学习·算法·sam·分割·交互式分割
zqh176736464691 小时前
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
人工智能·算法·阿里云·人工智能工程师·阿里云acp·阿里云认证·acp人工智能
fie88891 小时前
用模型预测控制算法实现对电机位置控制仿真
算法
Kent_J_Truman1 小时前
【交互 / 差分约束】
算法
ghie90901 小时前
x-IMU matlab zupt惯性室内定位算法
人工智能·算法·matlab
Magnum Lehar2 小时前
3d游戏引擎的Utilities模块实现
c++·算法·游戏引擎
yzx9910133 小时前
支持向量机的回归用法详解
算法·支持向量机·回归
小羊在奋斗4 小时前
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
算法·leetcode·链表