该程序中的for循环未按预期工作

时间:2019-01-31 14:33:31

标签: javascript

应该打印素数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);

3 个答案:

答案 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;
}

方法是一种出色的方法,可以通过隔离算法的组成部分来简化算法。它们是构建块,可以用来构建更复杂的系统,而不必跟踪整个过程。它使您可以进行较小的更改,每个更改都由其他关注事项封装而成,这意味着在进行这些更改时,您无需紧记。您只需记住的内容越少,发现错误就越容易。