给定数字的下一个更大质数求解:代码错误排查及修正
排查JavaScript下一个更大质数代码的错误及修正
问题描述
我编写了一段JavaScript代码,用于查找给定数字的下一个更大质数,逻辑是将输入数字逐步递增并逐个检查是否为质数,但实际运行输出与预期结果不符。
错误代码示例
function findNextPrime(num) { let nextNum = num; while (true) { if (isPrime(nextNum)) { return nextNum; } nextNum++; } } function isPrime(n) { if (n <= 1) return false; for (let i = 2; i < n; i++) { if (n % i === 0) { return false; } } return true; } // 测试情况 console.log(findNextPrime(11)); // 预期输出13,实际输出11
错误分析
- 起始检查值错误:
findNextPrime中nextNum初始化为输入的num,而需求是找下一个更大的质数,当输入本身就是质数时,会直接返回输入值,不符合预期。 - 质数检查效率低下:
isPrime的循环范围是i < n,无需遍历到n-1,因为若n存在大于其平方根的因数,必然对应一个小于平方根的因数,这样的写法会做很多无用功。
修正后的代码
function findNextPrime(num) { let nextNum = num + 1; while (true) { if (isPrime(nextNum)) { return nextNum; } nextNum++; } } function isPrime(n) { if (n <= 1) return false; if (n === 2) return true; if (n % 2 === 0) return false; // 仅检查奇数,循环到平方根即可 for (let i = 3; i <= Math.sqrt(n); i += 2) { if (n % i === 0) { return false; } } return true; } // 验证测试 console.log(findNextPrime(10)); // 输出11(符合预期) console.log(findNextPrime(11)); // 输出13(符合预期) console.log(findNextPrime(1)); // 输出2(符合预期) console.log(findNextPrime(2)); // 输出3(符合预期)
修正说明
- 调整
nextNum初始值为num + 1,确保从输入数字的下一个数开始检查,满足“下一个更大质数”的核心需求。 - 优化
isPrime函数:- 单独处理2(唯一的偶质数),直接返回结果;
- 排除所有大于2的偶数,减少无效检查;
- 循环仅遍历奇数且上限设为
Math.sqrt(n),在不影响正确性的前提下大幅提升效率。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

