JavaScript Prime数字生成器

时间:2013-03-31 17:34:55

标签: javascript

我正在尝试编写一个JavaScript素数生成器,列出1到100之间的每个素数。我知道这是一个常见的编程练习,网上有很多解决方案。我的问题是为什么我的解决方案导致空数组?这是代码:

var primeNumbers = [];
for (var x=2; x<101; x++)
    if (x%2 === 0) 
    {
        break;
    }
    else 
    {
        for (var y=2; y<101; y++) 
        {
            if (x/y > 1) 
            {
                break;
            }
            else 
            {
                primeNumbers.push(x);
            }
        }
    }
};
console.log(primeNumbers);

4 个答案:

答案 0 :(得分:4)

因为你要做的第一件事是x % 2 === 0。这是真的。 break将退出循环。我想你想要continue

答案 1 :(得分:2)

问题1:您在x%2 === 0时中断,因此您立即退出循环。反转条件并直接在循环中输入代码:

替换它:

if (x%2 === 0) {
  break;
}
else {

使用:

if (x%2 !== 0) {

问题2:如果x/y > 1,您正在退出内循环。这与条件x > y相同,因此将始终立即退出内循环。相反,使内循环从两个向上运行,最小为x

 for (var y=2; y<x; y++) {

问题3:您应该使用模运算符x,而不是将y除以x%y并与之比较。如果结果为零,则x不是素数。

问题4:您在内部循环中添加素数,因此您将多次使用大多数数字,而不只是素数一次。

您需要添加一个变量来跟踪内循环中发生的事情。如果内循环中的检查的 none 为零,则可以将x添加到素数列表中。

答案 2 :(得分:1)

您不必在限制之前测试每个数字,您只需要测试在该数字之前找到的素数。 如果您要查找1到10之间的所有素数,例如当您测试7时,您应该测试

7%2 === 0 false
7%3 === 0 false
7%5 === 0 false

是7是素数,而素数数组应该是

[0,1,2,3,5,7]

如你所见,我没有测试4因为4不是素数。这是你要测试的数字8

8%2 === 0 true > return false

并且您不必测试更多,因为您已经知道它不是素数。所以最终的解决方案应该是

function getPrimes(x){
        var ar = [];
        for (var counter = 0; counter <= x; counter++) {
            var notPrime = false;
            for (var i = 2; i <= ar.length && !notPrime; i++) {
                if (counter%ar[i]===0) {
                    notPrime = true;
                }
            }
            if (notPrime === false) ar.push(counter);
        }
        console.log(ar)
    }
    getPrimes(250);

答案 3 :(得分:0)

var funPrimeNumber=function(val){

 var iniX=2;
 var iniY=2;
 var flag=1;
 while(iniX<val){
            iniY=2; 
            flag=1;
                 while(iniY<iniX){
                     if(iniX%iniY==0){
                         //NOT PRIME NUMBER 
                         flag=0;
                     } 
                 iniY++;
                }

                 if(flag==1){
                    //PRIME NUMBER 
                    document.write(iniX + ", ");
                 }
        iniX++;          
      }
}

funPrimeNumber(100);