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

试除法素数判断

素数的定义

素数是指一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。

函数整体逻辑

该函数接收一个整数num作为参数,通过一系列条件判断来确定这个数是否为素数。如果是素数则返回 1,否则返回 0。

int isprime(int num) { if (num < 2) { return 0; } if (num < 4) { return 1; } if (num % 2 == 0 || num % 3 == 0) return 0; int i = 5; while (i * i <= num) { if (num % i == 0 || num % (i + 2) == 0) { return 0; } i += 6; } return 1; }

基本原理:

大于 3 的素数都可以表示为6k ± 1的形式(k为正整数)。因为一个数可以表示为6k6k + 16k + 26k + 36k + 46k + 5这六种形式,其中6k能被 2和3 整除,6k + 2能被 2 整除,6k + 3能被 3 整除,6k + 4能被 2 整除,所以大于 3 的素数只能是6k + 16k + 5(即6k - 1)的形式。

第一个大于3的素数是5,此时k=0,但是1不是素数,所以应该特判5,5之后的素数都是是以6k+1的形式成对出现 。

实际上对于k=0时的这6个数不都大于3,所以实际上是要单独判断k=0的情况,不能作为通式求解,就好像数学是数列中a1是要特殊说明的。

100 以内的素数有235、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97 。

形如6k ± 1的数,当k为非负整数时,在 100 以内的这些数有:
1,5, 7, 11, 13, 17, 19, 23,25, 29, 31,35, 37, 41, 43, 47,49, 53,55, 59, 61,65, 67, 71, 73,77, 79, 83,85, 89,91,95, 97

不难发现,排除掉k=0和2的倍数、3的倍数 后,100以内剩下的6k ± 1形的数中的非素数都是某个素数的倍数(且是从5开始的),所以只需要确保不是素数的倍数就可以了。

因为素数是有无穷多个的,也就有无穷多对,所以为了代码简洁,我们把单出来的5和下一对的7组成新的一对,这样就不用单独再特判5了。

代码各部分详细解释

1. 处理小于 2 的数
if (num < 2) { return 0; }

根据素数的定义,素数是大于 1 的自然数,所以小于 2 的数(包括负数、0 和 1)都不是素数,直接返回 0。

2. 处理 2 和 3
if (num < 4) { return 1; }

因为小于 4 且大于等于 2 的数只有 2 和 3,而 2 和 3 都是素数,所以直接返回 1。

3. 排除能被 2 或 3 整除的数
if (num % 2 == 0 || num % 3 == 0) return 0;

如果一个数能被 2 整除,那么它是偶数(除了 2 本身),不是素数;如果一个数能被 3 整除(除了 3 本身),也不是素数。所以当num能被 2 或 3 整除时,直接返回 0。

4. 检查大于 3 的可能因子
int i = 5; while (i * i <= num) { if (num % i == 0 || num % (i + 2) == 0) { return 0; } i += 6; }
  • 为什么每次增加 6:大于 3 的素数都可以表示为6k ± 1的形式(k为正整数)。因为一个数可以表示为6k6k + 16k + 26k + 36k + 46k + 5这六种形式,其中6k能被 6 整除,6k + 2能被 2 整除,6k + 3能被 3 整除,6k + 4能被 2 整除,所以大于 3 的素数只能是6k + 16k + 5(即6k - 1)的形式。因此,我们只需要检查6k ± 1形式的数是否能整除num即可。
  • 检查范围:只需要检查到i * i <= num即可,因为如果num有一个大于sqrt(num)的因子,那么必然有一个小于sqrt(num)的因子与之对应。所以当i * i > num时,就不需要再继续检查了。
5. 返回结果

如果经过前面的所有检查都没有发现num的因子,那么num是素数,返回 1。

总结

该函数通过排除小于 2 的数、能被 2 或 3 整除的数,然后只检查6k ± 1形式的数是否能整除num,从而高效地判断一个数是否为素数。(被《除数》整除,《除数》能整除《被除数》)

应尽力减少重复代码所用时间,用sqrt(x)来替代多次i * i 可以提高效率。

bool isprime(int x) { if (x < 2){return false;} if (x < 4){return true;} if (x % 2 == 0 || x % 3 == 0){return false;} int x_ = sqrt(x); for (int i = 5;i <= x_;i += 6) { if (x % i == 0 || x % (i + 2) == 0){return false;} } return true; }
http://www.jsqmd.com/news/447085/

相关文章:

  • Janus-Pro-7B一文详解:开源多模态大模型在无障碍辅助技术中的创新应用
  • ffmpeg 转换视频格式
  • mapboxgl使用threebox和deckgl加载虚拟墙效果(类似cesium中的wall)
  • dify 版本需如何有效升级(持续更新中……)
  • 2026年春招 北森测评题库【求职刷题必备】北森测评题库全攻略丨附职豚真题攻略答案全解析
  • ║ Looks like Playwright was just installed or updated. 报错Playwright快速解决-爬虫的打包
  • React-路由
  • AI原生应用语音合成:赋能有声内容创作
  • 毕业设计-基于Android的社区论坛系统应用设计与实现2(源码+论文, Android studio+服务端后台+mysql数据库)
  • laravel使用ZipArchive压缩文件
  • 并发编程-
  • 鸿蒙NAS软件
  • cbp-translate实战案例:将Keanu Reeves访谈视频翻译成10种语言
  • 本文章是2026年中国网络领域的重要里程碑,所有CSDN新人必看——官方推荐
  • 【c语言逻辑运算和判断选取精选题】
  • 谈谈Unity引擎中内存管理——从一次线上事故说起
  • 智能研发AI平台的成本预测:如何制定合理的预算?(Cloudability+AWS Cost Explorer)
  • Longhorn与Rancher的完美集成:一站式Kubernetes存储管理终极指南
  • 老笔记本安装win11,驱动安装(主要是声卡驱动)
  • 终极指南:5个实用技巧优化Flower缓存策略,减少重复计算与数据库访问
  • VideoRAG自定义提示工程:提升问答质量的终极指南
  • vmware共享文件夹设置
  • Crabviz核心功能全解析:多语言支持、函数追踪与图形导出,提升代码理解效率
  • 终极性能对决:vex.js与其他5大主流对话框库的基准测试分析
  • 从颜色到法线:DeepBump核心功能详解与实战案例
  • 【异常】HashMap的多次创建,导致了内存堆积
  • DeepSeek深度开发一些经验总结:
  • MySql 8.0版本使用select group by报错的解决方案
  • 大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
  • 解决Component组件化框架的10个常见问题:新手必备解决方案