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

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

相关文章:

  • 解决docker alpine缺少字体的问题 Could not initialize class sun.awt.X11FontManager
  • 使用 Docker Desktop 安装 Neo4j 知识图谱
  • 面试--HTML
  • scikit-learn在无监督学习算法的应用
  • 网络协议分析 实验五 UDP-IPv6-DNS
  • Leetcode (力扣)做题记录 hot100(62,64,287,108)
  • Java 虚拟线程(Virtual Threads):原理、性能提升与实践
  • Vue 图片预览功能(含缩略图)
  • 5.14本日总结
  • 常见 RPC 协议类别对比
  • WEB安全--Java安全--CC1利用链
  • 如何迁移 WSL 卸载 Ubuntu WSL
  • 5.18-AI分析师
  • 【深入Spring系列】源码级深入剖析SpringBoot如何实现自动装载
  • egpo进行train_egpo训练时,keyvalueError:“replay_sequence_length“
  • react+html-docx-js将页面导出为docx
  • 圈奶牛--二维凸包
  • HarmonyOs开发之———使用HTTP访问网络资源
  • 【Vue 3 + Vue Router 4】如何正确重置路由实例(resetRouter)——避免“VueRouter is not defined”错误
  • 前端面试每日三题 - Day 34
  • 一手实测深夜发布的世界首个设计Agent - Lovart。
  • 新华时评:中美经贸会谈为全球经济纾压增信
  • 影子调查丨三名“淘金客”殒命雪峰山:千余废弃金矿洞的监管难题
  • 中国科考船在钓鱼岛附近活动,外交部:完全是中国主权权利范围内的事
  • “应急侠”上线,应急管理部正式发布应急科普IP形象
  • 国内首例侵入式脑机接口系统前瞻性临床试验:受试者已能用意念玩游戏