应该打印素数n。 for循环将从2运行到x,每次都会迭代。如果为i == x
,则表示该数字不可分割,因此应将其打印为素数
var n;
var x = 2;
var i;
function prime(n) {
while (n) {
for (i = 2; i < x; i++) {
if (x % i == 0) {
break;
}
if (i == x) {
document.write(i + " ");
n--;
}
x++;
}
}
}
prime(10);
答案 0 :(得分:4)
当您尝试执行此代码时,此将永远不会进入for
循环,并且会进入无限的while循环。你有:
i = 2; i < x;
i
永远不会小于x
。而且它不会进入for
循环而出现。并且n
将始终为10
,这将导致无限循环。
您需要使用模运算符来检查数字是否可以被它们整除。
答案 1 :(得分:0)
也许可以稍微改变一下方法,并尝试使用for循环查找第一个X质数。
var n;
var x = 2;
var i;
function prime(n) {
if (n <= 0) return;
var i, j, p_no = 0, res = [];
for (i = 2; ; i++) {
var ifPrime = true;
for (j = 2; ifPrime && j <= Math.sqrt(i); j++) {
if (i % j === 0) ifPrime = false;
}
if (ifPrime) {
res.push(i);
console.log(i + ' ');
p_no++;
if (p_no === n) return res.toString();
}
}
}
document.getElementById('prime').innerHTML = prime(10);
<p id="prime"></p>
答案 2 :(得分:0)
运行代码时发生的事情是Praveen描述的。我想首先解决您的算法问题。
您似乎要打印的所有素数都小于特定数字n
。您将算法的不同方面混为一谈。具体来说,您将存在的循环组合起来以查找数字是否为质数,并且对所有小于n
的数字进行循环。
您可以做的第一件事就是使用方法。如果您有一个方法isPrime(k)
,如果给定的数字是素数,则返回true或false,那么函数的主循环看起来要简单得多,并将两个问题彼此分开:
function prime(n) {
for (var i = n; i > 1; i--) {
if (isPrime(i)) {
document.write(i + " ");
}
}
}
然后,您可以专注于单独定义isPrime方法,而不会使其部分与主循环混淆:
function isPrime(k) {
for (var i = 2; i < k; i++) {
if (k % i == 0) {
return false;
}
}
return true;
}
方法是一种出色的方法,可以通过隔离算法的组成部分来简化算法。它们是构建块,可以用来构建更复杂的系统,而不必跟踪整个过程。它使您可以进行较小的更改,每个更改都由其他关注事项封装而成,这意味着在进行这些更改时,您无需紧记。您只需记住的内容越少,发现错误就越容易。