【问题标题】:Why this code printing wrong prime numbers?为什么这个代码打印错误的素数?
【发布时间】:2019-10-21 07:05:41
【问题描述】:

“我认为问题出在 for 循环中。因为我在两个函数的循环中都使用了相同的“j”进行迭代。” 我想打印 1-100 的所有素数。 我认为所有代码都很好。但它一直显示除素数以外的输出。

我自己找不到答案。没有其他地方有书面答案。请帮帮我。我想了解这个问题。

var n = 100;

var prime1 = new Array();


//producing prime number upto 97
function primeNumber() {
  for (j = 1; j <= n; j++) {
    if (countRemainder(j) == 2) {
      prime1.push(j);

    }
  }
}
primeNumber();

console.log(prime1);


function countRemainder(n) {
  var count = 0;
  for (j = 1; j <= n; j++) {
    if (n % j == 0) {
      count++;
    }

  }
  return count;

}

【问题讨论】:

  • 您的j 的范围与您想象的不同。我建议始终在 Strict Mode 中运行您的代码
  • @TiiJ7 我不知道严格模式是什么。感谢您向我推荐这个宝贵的资源。
  • 我记得一位老师告诉她的学生:要写一本书,你需要写很多页。要写一页,你需要写很多段落。要写一个段落,你需要知道如何写一个句子。要写一个句子,你需要知道语法。要知道语法,你需要学习。有时学生愿意在不学习语法的情况下写书。原则上这很好,但在大多数情况下效果不佳。
  • @SC1000 太周到了。我吸取了教训。

标签: javascript function loops


【解决方案1】:

问题确实发生了,因为您在两个 for 循环中使用了相同的变量。

当您声明像 j = 0; 而不是像 var j = 0; 这样的变量时,该变量将被添加到全局范围(而不是您所在的范围,因此其他所有范围都可以看到和更改该变量)。

如果您的脚本在strict mode 中运行,那么这将引发错误,而不是将变量添加到全局范围。

因此,只需在每个 j 声明之前添加 var

var n = 100;

var prime1 = new Array();


//producing prime number upto 97
function primeNumber() {
  for (var j = 1; j <= n; j++) {
    if (countRemainder(j) == 2) {
      prime1.push(j);
    }
  }
}

primeNumber();

console.log(prime1);

function countRemainder(n) {
  var count = 0;
  for (var j = 1; j <= n; j++) {
    if (n % j == 0) {
      count++;
    }
  }
  return count;
}

【讨论】:

  • 尝试使用 let 声明来避免所有函数作用域/自动声明作用域问题
  • @vun 没有迹象表明 OP 正在使用 ES6,所以我不想添加任何可能不兼容的功能。此外,var 也适用于这种情况,因为脚本中没有任何异步操作。
【解决方案2】:

使用“let”正确声明“j”。

function primeNumber() {
  for (let j = 1; j <= n; j++) {
    if (countRemainder(j) == 2) {
      prime1.push(j);

    }
  }
}

【讨论】:

    【解决方案3】:

    试试这个

    var n = 100;
    
    var prime1 = new Array();
    
    
    //producing prime number upto 97
    function primeNumber() {
      for (var j = 1; j <= n; j++) {
        if (countRemainder(j) == 2) {
          prime1.push(j);
    
        }
      }
    }
    primeNumber();
    
    console.log(prime1);
    
    
    function countRemainder(n) {
      var count = 0;
      for (var j = 1; j <= n; j++) {
        if (n % j == 0) {
          count++;
        }
    
      }
      return count;
    
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2014-11-23
      • 2017-12-16
      • 2017-10-14
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多