Python质因数分解代码多数输入输出异常问题排查求助
问题排查与修正方案
我帮你排查了代码里的几个关键问题,这些正是导致多数数字输出异常的原因:
1. 全局factors列表导致质数判断完全错误
你的isprime函数使用了全局定义的factors列表,每次调用函数时都不会清空这个列表。比如第一次检查2是质数时,factors会被填充为[1,2];接下来检查3时,函数会继续往同一个factors列表里添加1,3,此时列表长度是4,会错误地判定3不是质数。后续所有质数判断都会因为这个累积的列表而失效。
修复方式:把factors列表移到isprime函数内部,作为局部变量,每次调用函数时重新初始化。
2. 浮点数除法导致变量类型异常
代码中使用n /= i进行除法,这会将整数n转换为浮点数(比如输入10,除以2后变成5.0)。虽然暂时不影响取模运算,但会导致后续逻辑中出现不必要的浮点数类型,建议使用整数除法n = n // i来保持n的整数类型。
3. 预生成所有质数的逻辑低效且冗余
先枚举所有小于等于原输入值的质数,其实是没必要的。质因数分解只需要从2开始逐个试除,直到n被分解为1即可,这样的逻辑更简洁高效,还能避免预生成质数时的错误。
修正后的完整代码
# Prime Factorisation while True: try: original_n = abs(int(input('Enter an integer to find its Prime Factorisation: '))) break except ValueError: print('Please enter an integer.') def isprime(num): # 将factors改为函数内部的局部变量,每次调用重新初始化 factors = [] for i in range(1, num + 1): if num % i == 0: factors.append(i) return len(factors) == 2 n = original_n dividers = [] # 优化质因数分解逻辑:从2开始试除,直到n变为1 i = 2 while n > 1: if isprime(i): while n % i == 0: dividers.append(i) n = n // i # 使用整数除法保持n为整数类型 i += 1 # 格式化输出 if dividers: output = ' x '.join(map(str, dividers)) print(f"{original_n} = {output}") else: # 处理输入为1的情况,1没有质因数 print(f"{original_n} has no prime factors.")
额外优化说明
- 单独保存了原始输入值
original_n,避免分解过程中修改原变量导致输出错误 - 优化了输出格式化的方式,用
join替代多次replace,更简洁可靠 - 增加了对输入
1的特殊处理,因为1没有质因数 - 细化了异常捕获类型(
ValueError),避免捕获所有异常的不良习惯
内容的提问来源于stack exchange,提问作者Aaryan Gamer
相关产品推荐
相关产品推荐

