如何用for循环实现质数判断?Python代码错误排查
原代码问题说明
原代码存在两个核心逻辑错误,直接导致合数误判:
- 分支绑定错误:代码里的
else和循环内的if做了配对,而非和外层for循环配对。这意味着函数只会校验第一个除数2,只要x不能被2整除就会直接返回True,根本不会遍历后续的除数。比如判断9时,9除以2余1,就直接触发return True,完全不会校验到真正的因数3,这就是9、25这类不能被2整除的合数被误判的根本原因。 - 边界场景缺失:按照质数定义,质数是大于1、且仅能被1和自身整除的自然数,原代码没有处理x<2的输入(0、1、负数都属于非质数);当输入x=2时,
range(2,2)是空序列,循环不会执行,函数会返回None而非正确结果True。
额外提一个可优化点:判断因数不需要遍历到x-1,因为因数是成对出现的,只要遍历到x的平方根即可,能大幅减少大数值判断时的计算量。
修正方案
核心逻辑修复(仅解决误判问题)
如果暂时不考虑效率和边界兼容,只需要把return True的逻辑移出for循环,等所有除数都校验完成后再返回结果即可,修改后代码如下:
def check_prime(x): for i in range(2,x): if x%i==0: return False return True
这个版本已经可以正确判定9、25等合数为非质数,但仍存在边界兼容问题、遍历效率偏低的缺陷。
完整优化版本
补全边界处理、优化遍历范围后的可直接投产代码:
import math def check_prime(x): # 过滤小于2的非质数 if x < 2: return False # 遍历范围取平方根+1,避免漏判整数平方根的情况,减少无效计算 for i in range(2, int(math.sqrt(x)) + 1): if x % i == 0: return False # 完整遍历完所有可能除数都没找到因数,才判定为质数 return True
效果验证
check_prime(9):遍历到i=3时触发整除判断,返回Falsecheck_prime(25):遍历到i=5时触发整除判断,返回Falsecheck_prime(2)、check_prime(7)等质数会正常返回True- 输入0、1、负数会直接返回
False,符合质数定义
内容的提问来源于stack exchange,提问作者Theekshana
相关产品推荐
相关产品推荐

