javascript - 素数子算法

标签 javascript primes

设计一个算法来接收正数 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++ 是后递增,它递增变量,但计算结果为旧值。因此,当您将结果分配回变量时,它会将其设置回原始值。结果,你就陷入了无限循环。

应该是:

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)) {
      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();

关于javascript - 素数子算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59079161/

相关文章:

javascript - 静态网站中的表格分页问题

javascript - 使用 Custom_AddDocLibMenuItems 的 SPDocumentLibrary 菜单项的顺序

javascript - 自动完成 JQuery-UI 未定义列表

matlab - MATLAB 的 factor() 函数背后发生了什么?

java - 如何在 4 个独立线程完成后安排打印语句?

javascript - 根据选择更新选项

javascript - 过滤器 "orderBy"无法将变量用作数组

java - 质数检查器无法工作

algorithm - 为RSA加密算法生成大素数

c - 质数校验码中的怪异情况