编写生成素数的JavaScript函数,为什么有些数字被排除在循环之外?

时间:2017-01-21 08:15:04

标签: javascript

我写了这个函数,为给定的数字范围生成素数,我认为它必须给出预期的结果,但是,有些数字被排除在结果之外:



function numberator(from, to) {
    numbers = [];
    for (x = from; x <= to; x++) {
        numbers.push(x);
    }
    return numbers;
}

function primeNumbers(array) {
    for (i = 0; i < array.length; i++) {
        for (j = 2; j < array[i]; j++) {
            if (array[i] % j == 0) {
                array.splice(i, 1);
            }
        }
    }
    return array;
}

console.log(primeNumbers(numberator(1,100)));
&#13;
&#13;
&#13;

结果包含:27,35和95(也是1,我稍后可以处理。)

我试图找出原因,但我无法做到。

4 个答案:

答案 0 :(得分:5)

该错误是使用splice对数组进行就地修改。你继续增加i,而数组的大小在执行时被修改。

您可以通过在每次切片操作后打印整个数组来调试它。

此外,该解决方案的效率非常低,并且在稍长的范围内表现非常差。使用Sieve of Eratosthenes

答案 1 :(得分:1)

在此

array.splice(i, 1);

语句您正在更改数组的长度,但不会相应地修改索引i。将其更改为

array.splice(i--, 1)

答案 2 :(得分:0)

只想分享一个简单易懂的Javascript代码以生成小的素数:https://github.com/HMaxF/generate-small-prime-number

答案 3 :(得分:-1)

更简单:

const isPrime = (n =>
        n>1 && 
        Array.from({length: Math.floor(Math.sqrt(n))-1},(e,i) => i+2)
             .every(m => n%m)
);

const generateRange = (from, to) => Array.from({length: to-from + 1}, (v, k) => k+from);

然后

generateRange(1, 100).filter(isPrime); // DONE!

&#13;
&#13;
//---- Utilities 
const isPrime = (n =>
        n>1 && 
        Array.from({length: Math.floor(Math.sqrt(n))-1},(e,i) => i+2)
             .every(m => n%m)
);

 const generateRange = (from, to) => Array.from({length: to-from + 1}, (v, k) => k+from);

//---------Apply ---
const from = 1;
const to = 100; 

 console.log (
    `Prime numbers from ${from} to ${to} are : `,
    generateRange(from, to).filter(isPrime)
  )
&#13;
&#13;
&#13;