首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我有一个无限循环,尽管我做了一个非常相似的方法?

为什么我有一个无限循环,尽管我做了一个非常相似的方法?
EN

Stack Overflow用户
提问于 2021-07-12 16:16:25
回答 1查看 63关注 0票数 0
代码语言: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,检查每个计数的数字,对于每个数字,它检查每个计数,检查它是否不是素数,如果它是素数,它会推送结果。

代码语言:javascript
复制
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;
}

这段代码检查一个被除数的数字是否没有给出一个浮动数字,并将其作为一个函数对每一个数计算到num,同时将素数加起来。

为什么我的程序中有一个无限循环?

我的是第一个代码块。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-12 16:54:10

代码中的问题是第二个for循环if条件。一旦条件测试为真,就永远不会中断循环。它是循环到给定数字的整个范围。

代码语言:javascript
复制
      if (i % z == 0 && i != z) {
        isNotPrime = true; // Need break statement after this.
      }

正如其他人指出的那样,计算结果花费的时间太长了。

我们可以对程序进行优化

  • 所有偶数都不是素数,因此可以将for循环增加2,这使我们在第二个for循环中计算
  • 的50%不需要检查数字的范围,而只检查数字/2的

这是我使用您的代码的解决方案:

代码语言:javascript
复制
  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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68350677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档