Python质数判断函数异常:输入15返回True求解决方案
问题分析与解决
你的质数判断函数输入15时返回True,核心问题是循环范围没覆盖到能整除15的最小奇数因子3。
看这段关键代码:
for j in range(3,int(math.sqrt(i))):
当i=15时,math.sqrt(15)≈3.872,转成int后是3,range(3,3)是个空序列——循环根本不会执行,函数直接跳过检查返回了True。
修正方法
方法1:扩展循环结束范围
把循环的结束值改为int(math.sqrt(i)) + 1,确保包含平方根的整数部分:
import math def isPrime(i): if i == 2 or i == 3: return True if i < 2: return False if i % 2 == 0: return False # 加1让循环覆盖到sqrt(i)的整数部分 for j in range(3, int(math.sqrt(i)) + 1): if i % j == 0: return False return True while True: print(isPrime(int(input())))
测试输入15时,循环会检查j=3,触发15%3==0的判断,返回False,结果正确。
方法2:用整数平方根函数(Python 3.8+)
Python 3.8及以上提供的math.isqrt()直接返回非负整数的平方根(向下取整),能避免浮点数转换的潜在问题,代码更简洁:
import math def isPrime(i): if i == 2 or i == 3: return True if i < 2: return False if i % 2 == 0: return False sqrt_i = math.isqrt(i) for j in range(3, sqrt_i + 1): if i % j == 0: return False return True while True: print(isPrime(int(input())))
额外优化建议
调整判断顺序+只检查奇数因子,提升代码逻辑清晰度和效率:
import math def isPrime(i): if i < 2: return False if i == 2 or i == 3: return True if i % 2 == 0: return False sqrt_i = math.isqrt(i) # 步长设为2,只检查奇数因子 for j in range(3, sqrt_i + 1, 2): if i % j == 0: return False return True
内容的提问来源于stack exchange,提问作者Thái Dương Phạm
相关产品推荐
相关产品推荐

