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

相关推荐
好学且牛逼的马1 分钟前
【HOT100|1 LeetCode 1. 两数之和】
数据结构·算法·leetcode
Nebula_g14 分钟前
C语言应用实例:斐波那契数列与其其他应用
c语言·开发语言·后端·学习·算法
不穿格子的程序员19 分钟前
从零开始刷算法-单调栈-每日温度
算法·单调栈
麦烤楽鸡翅21 分钟前
挡住洪水 (牛客)
java·数据结构·c++·python·算法·bfs·牛客
MicroTech202521 分钟前
微算法科技(NASDAQ MLGO)采用动态层次管理和位置聚类技术,修改pBFT算法以提高私有区块链网络运行效率
科技·算法·聚类
~~李木子~~21 分钟前
五子棋项目Alpha-Beta剪枝与MCTS+神经网络实现人机对弈算法对比报告
神经网络·算法·剪枝
bigdata-rookie22 分钟前
JVM 垃圾收集器介绍
java·jvm·算法
ʚ希希ɞ ྀ23 分钟前
leeCode hot 100 !!!持续更新中
数据结构·算法·leetcode
lemontree194524 分钟前
CRC8算法通用版本
算法
热爱生活的猴子25 分钟前
算法322. 零钱兑换
算法