【问题标题】:Create a function that finds how many prime numbers there are, up to the given integer创建一个函数,找出有多少个素数,直到给定的整数
【发布时间】:2020-03-31 16:15:32
【问题描述】:

//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循环,如果因子个数为零,那么它是一个素数。但无论输入如何,输出都是 9。因素的数量似乎也关闭了。

【问题讨论】:

  • "Uncaught ReferenceError: count is not defined",
  • count 声明在哪里?
  • 对不起,我忘记粘贴了,现在已经编辑好了
  • if (numoffactor == 0) { count++ } 应该做什么?所以如果没有 numoffactor 你增加循环外的计数??
  • @epascarello 如果 i 没有因子,那么它是一个素数,所以我将素数的计数加 1

标签: javascript math primes


【解决方案1】:

你错过了一些要点-

  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))

回家这有帮助。

【讨论】:

  • 在另一种解决方案中,console.log(primenumber(11)) 返回错误结果
  • @John 我不这么认为,你能解释一下吗?
  • 输出不显示 11,尽管计数是正确的,这就是所要求的。所以,你是对的。
  • @RisulIslam 我认为您的两个答案都给出了错误的结果。 console.log(primenumber(9)) 不是应该输出 4 而不是 5 吗?为您的两个示例尝试其他输入会再次出现相同的错误。
  • @Ivan86 1, 2, 3, 5, 7 这些是直到 9 的素数。关于 1 是否为素数存在一些争论。考虑到 1 是素数,我的答案是正确的。
【解决方案2】:

这应该适合你。函数primenumber 运行主for 循环并记录找到的素数数量,而isPrimeNumber 函数检查当前数字是否为素数并返回真或假。

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

【讨论】:

  • if(isPrimeNumber(i)) 。你的意思是 if(isPrimeNumber(i) = true)?
  • 好的,我添加了它,现在它工作正常。只是想知道是否有任何单一功能可以解决问题
  • @JiangYuxin 我可以很容易地把它变成一个单一功能的东西。但它更混乱。分离逻辑更好——更容易更新和维护。
【解决方案3】:

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

编辑:更新为跳过奇数值,正如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; }

【讨论】:

    【解决方案4】:

    试试这个代码

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多