Python程序bug排查:寻找仅能被2、3、5整除的前n个数
问题分析与修复
你的代码存在三个核心问题,导致输出结果不符合预期:
1. is_prime 函数逻辑错误
原函数在第一次循环时就直接返回结果,无法正确判断质数。比如判断k=9时,j=2不能整除9,函数直接返回1(认为是质数),但9实际是合数。
修复后的is_prime函数:
def is_prime(k): if k <= 1: return 0 if k == 2: return 1 if k % 2 == 0: return 0 # 只遍历奇数到平方根,提升效率 for j in range(3, int(k**0.5) + 1, 2): if k % j == 0: return 0 return 1
2. is_divisible 函数逻辑错误
原函数在第一次循环(k=7)时就返回结果,不会检查后续的质数。比如i=330时,330%7≠0,函数直接返回0,忽略了330%11=0的情况,导致错误判定330符合条件。
更高效的实现方式是直接移除所有2、3、5的因子,剩余结果为1则说明没有其他质因数:
def is_divisible(i): if i <= 1: return 0 # 移除所有2的因子 while i % 2 == 0: i = i // 2 # 移除所有3的因子 while i % 3 == 0: i = i // 3 # 移除所有5的因子 while i % 5 == 0: i = i // 5 # 剩余为1则无其他质因数,否则存在其他质因数 return 0 if i == 1 else 1
3. 主逻辑条件错误
原代码要求数必须同时被2、3、5整除(i%2==0 and i%3==0 and i%5==0),但题目要求的是质因数仅包含2、3、5的数(比如2、3、4、5、6等都符合条件),并非必须同时被三者整除。
修复后的主循环逻辑:
count = 0 i = 1 while count < n: if is_divisible(i) == 0: print(i) count += 1 i += 1
完整修复后的代码
def is_divisible(i): if i <= 1: return 0 while i % 2 == 0: i = i // 2 while i % 3 == 0: i = i // 3 while i % 5 == 0: i = i // 5 return 0 if i == 1 else 1 while True: while True: try: n = input("How many numbers do you want to find: ") n = int(n.replace(" ", "")) if n > 0: break print("Input only natural numbers") except: print("Input only natural numbers") count = 0 i = 1 while count < n: if is_divisible(i) == 0: print(i) count += 1 i += 1 repeat = input("To repeat press (1), to end press anything else: ") if str(repeat) != "1": print("Bye!") break
结果验证
当输入n=10时,正确输出应为:
1 2 3 4 5 6 8 9 10 12
(如果你的需求是仅包含同时被2、3、5整除的数,可保留原主条件,但需修复前两个函数问题,此时330会被正确排除,210也不会被输出,因为它包含质因数7)
内容的提问来源于stack exchange,提问作者EdvardsMekss
相关产品推荐
相关产品推荐

