创建一个函数,查找有多少个素数,最多为给定整数

Create a function that finds how many prime numbers there are, up to the given integer

//Create a function that finds how many prime numbers there are, up to the given integer.
var numoffactor = 0
var count=0
function primenumber(str) {
    for (var i = 0; i < str; i++)
        for (var g = 0; g < i; g++) {
            if (i % g == 0) //if a factor is found
            { numoffactor++ }

        }
    if (numoffactor == 0) { count++ }
    return count
}
console.log(primenumber(9)) //showing 0 no matter what number I put in

console.log(numoffactor)//showing 12

我这里的逻辑是:从0开始到str,求每个整数的因子个数,每i次循环,如果因子个数为0,则为质数。但无论输入如何,输出都是 9。因素的数量似乎也已关闭。

这应该适合你。函数 primenumber 运行主 for 循环并记录找到了多少个素数,而 isPrimeNumber 函数检查当前数字是否为素数以及 returns 真或假。

function primenumber(str){
  let counter = 0;

  if(str <= 1)
    return 0;

  for(let i=2; i < str; i++) {
    if( isPrimeNumber(i) )
      counter++;
  }

  return counter;
}
 
function isPrimeNumber(num) {
  if( num == 2 )
    return true;

  for(let g=2; g < num; g++) {
    if (num % g == 0) {
      return false;
    }
  }
  
  return true;
}
 
document.write (primenumber(9));

你漏掉了一些要点-

  1. 你不能将数字除以 0。这是未定义的。
  2. 所有数字都可以被1整除,所以你不检查。
  3. 您没有将每个数字的 numoffactor 重置为 0
  4. 第一个 for 循环括号丢失。 numoffactor == 0 检查必须 在 for 循环中。
var numoffactor = 0
var count = 0
function primenumber(str) {
    if(str <= 1)
        return 0;
    for (var i = 1; i < str; i++) {
      numoffactor = 0;
      for (var g = 2; g < i; g++) {
          if (i % g == 0){
            numoffactor++;
          }
      }
      if (numoffactor == 0) {
        count++;
      }
    }
    return count;
}

console.log(primenumber(9))
console.log(numoffactor)

这是另一种解决方案,您不需要计算因子的数量。

var count = 1
function primenumber(str) {
    if(str <= 1)
        return 0;
    for (var i = 0; i < str; i++) {
      var g = 2;
      for (; g < i; g++) {
          if (i % g == 0)
            break;
      }
      if (i == g) {
        count++;
      }
    }
    return count;
}

console.log(primenumber(9))

主页这有帮助。

可以生成一个范围内所有素数的列表,都是抓长度。

编辑: 已更新以跳过奇数值,如 georg 建议的那样。

const pushIf = (arr, value, fn) => { if (fn(value)) { arr.push(value) } }

const isPrime = (n) => {
  for (let i = 2; i < n; i++) {
    if (n % i === 0) {
      return false
    }
  }
  return n > 1
}

const primes = (min, max) => {
  min = min || 2
  if (max === undefined) { max = min; min = 2 }
  let primeList = [], n = min
  if (n % 2 === 0) { // if min is even
    pushIf(primeList, n, isPrime)
    n++ // goto next odd
  }
  while (n < max) {
    pushIf(primeList, n, isPrime)
    n += 2 // skip odds
  }
  return primeList
}

console.log(primes(5, 10).length) // 2 (5 and 7)
console.log(primes(1000).length)  // 168
.as-console-wrapper { top: 0; max-height: 100% !important; }

试试这个代码

function primeFactorsTo(max)
{
    var store  = [], i, j, primes = [];
    for (i = 2; i <= max; ++i) 
    {
        if (!store [i]) 
          {
            primes.push(i);
            for (j = i << 1; j <= max; j += i) 
            {
                store[j] = true;
            }
        }
    }
    return primes.length;
}

console.log(primeFactorsTo(9))