Project Euler第3题:如何让Sieve of Eratosthenes实现正常运行
问题分析
- 埃氏筛实现效率极低,触发平台死循环检测
你采用的双层循环模运算筛法时间复杂度为O(n²),当输入为600851475143时,√600851475143≈775146,两层循环累计需要执行几十万亿次运算,运行时间远超平台阈值,被判定为潜在无限循环,代码执行被提前中断,返回的质数数组不完整,最终结果错误。 - 质因数查找逻辑存在遗漏
即便筛法能完整执行,你的逻辑也仅能覆盖最大质因数小于等于√输入值的场景,若输入值本身是质数,或是存在大于√输入值的质因数,结果就会出错。 - 无效冗余代码
函数开头初始化的[2,3,5,7]数组无实际作用,输入大于7时会被直接覆盖。
修复方案
推荐用更简洁高效的试除法实现,完全避免高复杂度的筛法逻辑:
function largestPrimeFactor(number) { let maxPrime = 1; // 处理2的因数 while (number % 2 === 0) { maxPrime = 2; number = number / 2; } // 处理奇数因数,步长设为2跳过偶数 for (let i = 3; i <= Math.sqrt(number); i += 2) { while (number % i === 0) { maxPrime = i; number = number / i; } } // 剩余值大于2则本身为最大质因数 if (number > 2) { maxPrime = number; } return maxPrime; }
验证结果
输入600851475143时,返回结果为6857,与Project Euler第3题正确答案一致,不会触发平台死循环检测。
内容的提问来源于stack exchange,提问作者PrimeBeat
相关产品推荐
相关产品推荐

