Python代码无输出仅空行求助:求600851475143最大质因数
问题分析与代码修正
你的代码存在几个关键问题,导致程序无法正常结束且输出异常:
1. 循环范围过大,计算量爆炸
第一个循环range(2, 600851475143)要遍历6000多亿次,这在现实中根本不可能执行完成,程序会一直卡在这个循环里,自然不会执行到后面的打印语句。
2. 因数收集逻辑低效且不完整
找因数不需要遍历到原数,只需要遍历到原数的平方根即可。因为如果i是q的因数,那么q//i也必然是q的因数,这样能把循环次数从6e11降到约77万(因为√600851475143≈775146),效率提升几个数量级。
3. 质因数判断逻辑错误
你用i>3且i%6==1来判断质数是完全错误的:
- 质数除了2和3,确实满足
i%6==1或i%6==5,但反过来满足这个条件的数不一定是质数(比如25=5×5,25%6=1,但它是合数) - 你漏掉了2、3这两个最小的质数,也漏掉了所有
i%6==5的质数(比如5、11等)
4. 列表添加语法不规范
虽然list.append(factors, i)在Python中能运行,但更规范的写法是factors.append(i),前者是调用列表类的append方法,后者是调用列表实例的方法,结果一致但后者更易懂。
修正后的代码(高效版)
直接用质因数分解的思路,一步步分解原数,同时记录最大的质因数,不需要先找所有因数再筛选:
q = 600851475143 largest_prime = 1 # 先处理2的情况 while q % 2 == 0: largest_prime = 2 q = q // 2 # 处理奇数,从3开始,每次加2 i = 3 while i * i <= q: while q % i == 0: largest_prime = i q = q // i i += 2 # 如果最后剩下的q大于2,说明它本身是质数 if q > 2: largest_prime = q print("最大质因数是:", largest_prime)
代码解释
- 先处理所有2的因数:因为2是唯一的偶质数,单独循环处理能减少后续奇数循环的次数。
- 从3开始遍历奇数,每次判断当前i是否能整除q,如果可以,就把i记录为当前最大质因数,然后把q除以i直到不能整除。
- 循环条件
i*i <= q:当i超过q的平方根时,剩下的q如果大于2,必然是质数,直接作为最大质因数。
这个方法的循环次数极少,能瞬间得出结果(答案是6857)。
内容的提问来源于stack exchange,提问作者Rulian
相关产品推荐
相关产品推荐

