4

我正在尝试编写一个 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

4 回答 4

4

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

于 2013-03-31T17:36:20.193 回答
2

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

替换这个:

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

和:

if (x%2 !== 0) {

问题 2:如果x/y > 1. 这与条件相同x > y,因此总是会立即退出内部循环。而是使内部循环从 2 到 1 小于 1 运行x

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

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

问题 4:您在内循环中添加素数,因此您将多次得到大多数数字,而不仅仅是一次素数。

您需要添加一个变量来跟踪内部循环中发生的事情。如果内部循环中的所有检查都不为零,那么您可以添加x到素数列表中。

于 2013-03-31T18:01:53.497 回答
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);
于 2016-03-17T19:21:05.680 回答
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++;          
      }
}

有趣的素数(100);

于 2016-06-09T13:49:03.240 回答