打印素数时输出错误

时间:2013-06-28 19:38:58

标签: javascript

代码错误地将许多非素数计算为素数,我不确定为什么。基本上输出交替输入“prime”和“not prime”。

#!/usr/bin/env node

for (var i = 3; i <= 30; i++) {
  console.log(i + ": " + isPrime(i) + " ");
}

function isPrime(num) {
  var counter;

  for (counter = 2; counter < num; counter++) {
    if(num % counter == 0) {
      return "not prime";
    }
    else {
      return "prime";
    }
  }
}

5 个答案:

答案 0 :(得分:0)

num%2是num mod 2,这意味着除以2之后的数字的剩余部分。

你真正想做的是这样的事情:

primes = [2]
for (var i=0;i<primes.length;i++){
    if (primes[i]<sqrt(num)){
        if (num % primes[i] == 0){
            console.log("Not prime!");}
        }
    else{
        console.log("prime!");
        primes.push(num);
    }
}

当你确定素数时,你应该只是试图构建你正在检查的数字的素数因子分解,否则你做的工作比你应该做的更多。由于素数因子分解是由素数构成的,因此这些是你应该检查模数的唯一数字。

此外,您应该只检查数字的平方根,因为任何可被整除的数字都将具有匹配的数字。例子:

104 = 57*2
39 = 13*3

复杂度从O(n)到O(log(sqrt(n)),这是4次比较,而不是100,即使只有100的n,它也会越来越好。

答案 1 :(得分:0)

for (var i = 3; i <= 30; i++) {
  console.log(i + ": " + isPrime(i) + " ");
}

function isPrime(num) {
  var counter;

  for (counter = 2; counter < num; counter++) {
    if(num % counter == 0) {
      return "not prime";
    }
  }
  // only return that it is prime if it is not evenly
  // divisible by all numbers less than it
  // (technically you only need to check up to sqrt(num) + 1)
  return "prime";
}

答案 2 :(得分:0)

你需要在循环之后返回true,而不是在循环内部。例如,如果(9%2 == 0)则返回第一次迭代次数。否则返回素数。但九不是素数。只有在通过迭代后才返回true,你会找到预期的结果。

function isPrime(num) {
var counter;

for (counter = 2; counter < num; counter++) {
if(num % counter == 0) {
  return " not prime";
}
}
  return " prime";
}

答案 3 :(得分:0)

Fiddle

在完成循环检查后,你必须返回素数

for (var i = 3; i <= 30; i++) {
  console.log(i + ": " + isPrime(i) + " ");
}

function isPrime(num) {
  var counter;

  for (counter = 2; counter < num; counter++) {
    if(num % counter == 0) {
     return "not prime";
    }
  }
  return "prime";

}

答案 4 :(得分:-1)

第一次出现错过f(num % counter == 0)条件的情况时,它将返回非素数

从你的for-loop

中取出return "prime";电话的最简单方法
function isPrime(num) {
    for(counter = 2; counter < num; counter++) {

        if(num % counter == 0) {
            return "not prime";
        }
    }
    return "prime";
}