python如何判断素数:通过循环取余校验数值是否仅能被1和自身整除
刚开始学Python基础语法的时候,最卡我的基础实操问题就是python如何判断素数,对着网上零散的代码抄了好几次,跑出来的结果永远对错参半,要么把1判定成素数,要么偶数全部识别错误,折腾的人特别烦躁,明明看着代码逻辑一模一样,结果就是不对。
最开始的认知特别简单粗暴,单纯觉得素数就是除了1和自己,没有其他除数的数,写代码的时候直接写了个循环,从2遍历到输入的数字本身,挨个取余判断,只要所有余数都不为0,就直接判定这个数是素数。完全没考虑过特殊数值、循环冗余这些问题,纯靠字面理解写代码。
那段粗糙的代码测试小数字比如2、3、5的时候,都能正常输出正确结果,就傻乎乎的以为自己彻底写对了,直到随机输入数字1测试边界情况,程序直接判定1是素数。课本里明确标注1不属于素数,这么基础的知识点,写代码的时候完全抛在脑后,这就是最致命的逻辑漏洞,当时反复运行代码五六遍,都没找到问题出在哪,只顾着疑惑为什么基础判断会出错。
这是第一个致命坑。
后来才反应过来,所有Python素数判断的代码,第一步必须先做数值前置筛选,小于2的数字直接全部排除,根本不需要进入后续的循环判断环节。改完这一行判定代码之后,1的识别问题彻底解决了,可新的问题又立马出现,输入9、15、21这类奇数合数,代码依旧会误判为素数,结果还是不准确。
当时脑子完全转不过弯,固执的认为循环遍历的范围越全面,判断结果就越精准,一直傻傻遍历到目标数字本身,不仅代码运行效率极低,处理大数的时候会明显卡顿,还积攒了一堆逻辑冗余问题。折腾好久才搞明白,任意一个自然数的因数,都不会超过它的算术平方根,根本没必要完整遍历全部数字,只要遍历到平方根的位置,就能完成所有整除校验,这也是优化素数判断代码最关键的一步,我当时硬生生靠一次次试错摸透了这个细节。
调整遍历范围后,再搭配分层判断,代码才算真正稳定可用。实操的固定流程很清晰,首先判定数值是否小于2,直接判定非素数;数值等于2直接判定为素数,这是所有偶数里唯一的素数;大于2的数值先直接剔除所有偶数,减少循环次数,再从3开始,以2为步长遍历到数值平方根,逐个取余校验,只要出现余数为0的情况,就是合数,全程无匹配则为素数。
网上很多大佬写的一行精简代码看着特别高级,但其实很不适合新手,不仅可读性极差,还容易出现各种边界bug,日常练习和小型项目里,老老实实分层写判断逻辑,是最稳妥、最不容易出错的写法。
那天晚上调试完最终版代码,逐行核对完所有测试用例,确认2、1、9、97这些易错数值都能精准判断后,保存好文件关掉编译器,盯着电脑屏幕暗下去的光影,一动不动坐了好几分钟。