素数子算法

Prime number subalgorithms

设计一个算法来接收一个正数n,并输出所有小于n的素数 并且有一个数字 7。例如,如果 n 为 100,则程序应输出 7、17、37、47、67、71、73、79 和 97。

程序在没有给出输出的情况下冻结

function P6() {
  var n = parseInt(prompt("Please enter a value"));

  for (var i = 2; i <= n; i++) {
    if (prime(i) && has7(i)) {
      alert(i);
    }
  }
}

function prime(s) {
  var flag = true;
  var d = 2;
  while (flag == true && d <= s / 2) {
    if (s % d == 0) {
      flag = false;
    }
    d = d++;
  }
  return flag;
}

function has7(v) {
  var has7 = false;
  var length = Math.log(v) + 1;
  for (var i = 1; i <= length; i++) {
    var last = v % 10;
    if (last == 7) {
      has7 = true;
    }
    v = v % 10
  }
  return has7;
}

这一行是错误的:

d = d++;

d++ 是一个 post 增量,它会增加变量但求值为旧值。因此,当您将结果分配回变量时,它会将其设置回原始值。结果,你有一个无限循环。

应该是:

d = d + 1;

或者只是:

d++;

另一个错误是:

v = v % 10;

这本应将 v 除以 10,但它只是将 v 设置为其最后一位。应该是:

v = Math.floor(v / 10);

在下面的代码中,我简化了所有循环。他们不是设置变量并继续循环,而是 return 一旦循环可以确定答案。如果循环结束时没有 returning,它们 return 相反的值。

function P6() {
  var n = parseInt(prompt("Please enter a value"));

  for (var i = 2; i <= n; i++) {
    if (prime(i) && has7(i)) {
      console.log(i);
    }
  }
}

function prime(s) {
  for (var d = 2; d <= s / 2; d++) {
    if (s % d == 0) {
      return false;
    }
  }
  return true;
}

function has7(v) {
  while (v != 0) {
    var last = v % 10;
    if (last == 7) {
      return true;
    }
    v = Math.floor(v / 10);
  }
  return false;
}

P6();