在此程序中
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);
你总是在第一次迭代时跳出循环:
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);