嵌套循环挑战

问题描述 投票:0回答:1

在此程序中

j
值始终为0。为什么?

我尝试找到 0 到 100 之间的素数。素数在

prime
数组中,非素数在
notPrime
数组中。当我执行这个程序时,我陷入了嵌套的 for 循环。我尝试 console.log(j) j 值始终为 0。为什么?

const n = 100;
const prime = [];
const notPrime = [];
if (n > 1) {
  for (let i = 0; i <= n; i++) {
    // console.log(i);
    for (var j = 0; j <= i; j++) {
      console.log(j);
      console.log(j);
      console.log(i,j);

      if (i % j === 0) {
        prime.push(i);
        break;
      } else {
        notPrime.push(i);
        break;
      }
    }
  }
} else {
  alert("enter the lagrest number");
}

console.log(prime);
console.log(notPrime);


javascript for-loop nested-loops primes
1个回答
2
投票

你总是在第一次迭代时跳出循环:

if (i % j === 0) {
  prime.push(i);
  break;
} else {
  notPrime.push(i);
  break;
}

...所以 j 永远不可能达到大于零的值。

您需要重新思考您的逻辑才能使其发挥作用。如果您找到给定数字的除数,您立即知道它不是素数,因此可以打破循环。

但是要确定它是否素数,您必须继续检查其余的潜在除数,然后才能确定,因此需要继续该内部循环。

出于显而易见的原因,

1 和 0 不是潜在的除数,因此您的内部循环应该从 2 开始。任何大于

i / 2
的内容都可以安全地跳过,因为不可能将任何内容均匀地划分为比“一半”更大的块.

const n = 100;
const prime = [];
const notPrime = [];

for (let i = 1; i <= n; i++) {
  // we're checking to see if i is prime. Assume it is until proven otherwise:
  let isPrime = true;

  // check for divisors:
  for (var j = 2; j < (i / 2); j++) {
    if (i % j == 0) {
      // found a divisor, so we know i is not prime
      isPrime = false;
      break;
    }
    // note there is no "else" clause here.
    // you need to finish the inner loop before you can be sure it's prime
  }

  // now we've checked everything so can record the results for i:
  isPrime ? prime.push(i) : notPrime.push(i) ;
}

console.log(prime);
//console.log(notPrime);

© www.soinside.com 2019 - 2024. All rights reserved.