素数子算法

问题描述 投票:0回答:1

设计一个算法来接收正数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;
}
javascript primes
1个回答
0
投票

此行是错误的:

d = d++;

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

应该是:

d = d + 1;

或仅:

d++;

另一个错误是:

v = v % 10;

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

v = Math.floor(v / 10);

在下面的代码中,我简化了所有循环。它们没有设置变量并继续循环,而是在循环确定答案后立即返回。如果循环结束而不返回,则它们返回相反的值。

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) {
  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();
© www.soinside.com 2019 - 2024. All rights reserved.