2013-08-03 38 views
0

有人可以帮助使用此代码吗?它应该得到第10,001个素数。我知道is_prime函数可用于测试数字是否为素数,因为我成功地将此代码用于以前的问题。现在我只是试图在for循环中调用它,直到计数器达到我想要的值,同时将最新的数字存储到变量“持有人”和最后的印刷持有人中。欧拉7 Javascript

function is_prime(num) { 
    if (isNaN(num)) return false; 
    for (var i=2; i<=Math.sqrt(num); i++) { 
     if (num % i === 0) { 
      return false; 
     } 
    } 
    return true; 
} 

function getBigPrime() { 
var holder = 0; 
var counter = 0; 
    for (var k=3; counter<=10000; k+=2) { 
     if (is_prime(k)) 
      holder = k; 
      counter += 1; 
    } 
    console.log(holder); 
} 

getBigPrime(); 
+0

http://stackoverflow.com/questions/16074244/finding-the-10001st-prime的可能的复制-number-project-euler – CBIII

+0

我不认为循环正常工作。如果我将循环的for语句中的'counter'更改为不同的数字,我的结果不会改变。 –

+0

@CBIII谢谢你指点,我没有找到那个。似乎他使用一种不同的方法,我仍然很困惑,为什么我的代码不起作用! –

回答

0

您有计数器的范围错误。 为了您的for循环可以初始化counter = 1;占2和保留原样

http://jsfiddle.net/XtTYm/2/

function is_prime(num) { 
    if (isNaN(num)) return false; 
    var sq = Math.sqrt(num); 
    for (var i=2; i<=sq; i++) { 
     if (num % i === 0) { 
      return false; 
     } 
    } 
    return true; 
} 

    function getBigPrime() { 
    var holder = 0; 
    var counter = 1; 
     for (var k=3; counter<=10000; k+=2) { 
      if (is_prime(k)){ 
       holder = k; 
       counter += 1; // should be inside the if 
      } 
     } 
     console.log(holder); 
    } 

    getBigPrime(); 
+0

您通过省略'var'将'sq'放入全局范围。 – Blender

+0

啊是的。谢谢。快速编辑和什么不是。 – CBIII

2

如果省略if块的括号,则只有第一行实际上是块的一部分。您当前的if语句具有这样的:

if (is_prime(k)) { 
    holder = k; 
} 

counter += 1; 

此外,你的循环跳过2,第一个素数。

+0

也是很好的说明,谢谢 –