javascript - 尽管采取了非常相似的方法,为什么我会得到一个无限循环?
问题描述
// loop 1, 2 etc
var primeNums = [];
for (var i = 2; i < num; i++) {
// check if prime
console.log('i ', i);
var isNotPrime = false;
for (var z = 2; z < i; z++) {
// 7 / 2 is not factor or 7 == 7 prime
if (i % z == 0 && i != z) {
isNotPrime = true;
}
console.log('z', z, i);
}
if (isNotPrime == false) {
primeNums.push(i)
}
}
console.log(primeNums.reduce((add, current) => {
return add += current;
}));
return primeNums.reduce((add, current) => {
return add += current;
});
}
sumPrimes(977);
此代码具有 primeNums 并检查每个向上计数的数字,对于每个数字,它检查每个向上计数的数字并检查它是否不是素数,如果是素数,则推送结果。
function sumPrimes(num) {
// Helper function to check primality
function isPrime(num) {
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0)
return false;
}
return true;
}
// Check all numbers for primality
let sum = 0;
for (let i = 2; i <= num; i++) {
if (isPrime(i))
sum += i;
}
return sum;
}
此代码检查除数是否不给出浮点数,并将其作为每个数的函数运行,同时将素数相加。
为什么我的程序会出现无限循环?
我的是第一个代码块。
解决方案
您的代码中的问题是第二个 for 循环 if 条件。一旦条件被测试为真,您就永远不会打破循环。它循环到给定数字的整个范围
if (i % z == 0 && i != z) {
isNotPrime = true; // Need break statement after this.
}
正如其他人指出的那样,计算结果花费的时间太长。
我们可以为程序做的优化
- 除了 2 之外,所有偶数都不是素数,因此您始终可以将 for 循环增加 2,这需要我们计算 50% 的数字
- 在第二个 for 循环中,您不需要检查数字的范围,而是只检查数字/2
这是我对您的代码的解决方案:
var primeNums = [];
function sumPrimes(num) {
for (var i = 3; i < num; i+=2) {
// check if prime
console.log('i ', i);
var isNotPrime = false;
for (var z = 2; z < i/2; z++) {
// 7 / 2 is not factor or 7 == 7 prime
if (i % z == 0 && i != z) {
isNotPrime = true;
break;
}
console.log('z', z, i);
}
if (isNotPrime == false) {
primeNums.push(i)
}
}
console.log(primeNums.reduce((add, current) => {
return add += current;
})+2);
return primeNums.reduce((add, current) => {
return add += current;
}) + 2; // Add extra 2 since initial 2 is removed.
}
sumPrimes(977);
推荐阅读
- java - 为底部导航栏保留 Backstack Android Studio (Java)
- swift - Xcode 11.4 中的资产目录编译 (actool) 失败
- r - 有没有办法限制`coxme` R包中的方差估计?
- php - 使用
在 PHP 中的函数
- laravel - 我想在 Docker 容器中发布 Laravel 应用程序,我应该在 Docker 中使用 Docker 还是使用 docker-compose 来添加所有服务?
- arrays - 带有条件的 MongoDB 项目数组文档大小
- javascript - 滚动超过页面上的某个点时如何水平居中活动选项卡
- spring - 如何围绕休息调用编写 Resilience4j CircuitBreaker 包装器
- c# - 在通知需要确认电子邮件地址之前验证登录凭据
- java - OSGi:BND 工具无法 @Reference 仅特定组件