当前位置: 首页 > web >正文

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

代码引用

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. 先排除特殊情况

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. 只检查到平方根

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

http://www.xdnf.cn/news/6151.html

相关文章:

  • C语言:51单片机实现数码管依次循环显示【1~F】课堂练习
  • Spring 中的 @Configuration @Bean注解
  • PyTorch 中神经网络相关要点(损失函数,学习率)及优化方法总结
  • 建筑IT数字化突围:建筑设计企业的生存法则重塑
  • java连数据库
  • FFmpeg视频编码的完整操作指南
  • 如何设置FFmpeg实现对高分辨率视频进行转码
  • Tailwind CSS 实战教程:从入门到精通
  • 基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究
  • 数据库系统概论|第七章:数据库设计—课程笔记
  • 使用大语言模型从零构建知识图谱(上)
  • Kubernetes控制平面组件:Kubelet详解(三):CRI 容器运行时接口层
  • 国产 ETL 数据集成厂商推荐—谷云科技 RestCloud
  • 【C++设计模式之Decorator装饰模式】
  • 砷化镓太阳能电池:开启多元领域能源新篇
  • 什么是SparkONYarn模式?
  • 【解析:新能源汽车芯片主要玩家及技术发展】
  • 聊聊JetCache的缓存构建
  • 基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正|文献速递-深度学习医疗AI最新文献
  • SVM在医疗设备故障维修服务决策中的应用:策略、技术与实践
  • NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级
  • 不借助 Cursor,如何开发第一款 ios 产品并做到付费榜 Top 2
  • C# 通过脚本实现接口
  • C++:二叉搜索树
  • 【C++】map和set的模拟实现
  • vscode调试c/c++
  • Python笔记:在环境变量中增加了dll加载路径,python提示DLL加载失败
  • HTML:入门
  • Angular 知识框架
  • 【SQL】如何在 SQL 中统计结构化字符串的特征频率