生成素数的程序不起作用
Program to generate primes not working
我编写了以下代码来生成一个素数数组,直到数字 'num'。
但它给出了完全出乎意料的结果。
我尝试在 chrome 上调试它,但调试器没有多大帮助,因为它只是跳过了第 4 行。
function Sieve(num) {
var arr = Array.from({length:num-1}).map((x,i)=> i+2);
var numb = Math.floor(Math.sqrt(num));
var arra = Array.from({length:numb-1}).map((x,i)=> i+2);
arra.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y=!x)));
console.log(arr);
}
Sieve(10)
这应该是埃拉托色尼筛法算法吗?顺便提一下,你知道这不是生成素数的最快方法吗?
Bersteins's primegen 确认速度更快,它们可能是更快的解决方案。
除此之外,让我们显示您要实现的目标的简单代码:
var eratosthenes = function(n) {
// Eratosthenes algorithm to find all primes under n
var array = [], upperLimit = Math.sqrt(n), output = [];
// Make an array from 2 to (n - 1)
for (var i = 0; i < n; i++) {
array.push(true);
}
// Remove multiples of primes starting from 2, 3, 5,...
for (var i = 2; i <= upperLimit; i++) {
if (array[i]) {
for (var j = i * i; j < n; j += i) {
array[j] = false;
}
}
}
// All array[i] set to true are primes
for (var i = 2; i < n; i++) {
if(array[i]) {
output.push(i);
}
}
return output;
};
这更容易理解并分成几个部分。
顺便说一句,你知道 Array.from(new Array(n-1), (x,i) => i+2);
有用吗?不需要先array.from()
再.map()
,可以直接将map函数作为参数传给from。此外,新的 Array(n) 代码更具可读性。
这是使用您的原则的解决方案。
function Sieve(num) {
var arra = Array.from(new Array(num-1), (x,i) => i+2);
var comb = Array.from(new Array(Math.sqrt(num)-1), (x,i) => 2+i);
comb.forEach(x => arra=arra.filter(y => (y%x !== 0) || (y===x) ));
console.log(arra);
}
Sieve(100);
它在 CodePen 上,因为 JSFiddle 坏了。 labda solution to Erathostene's sieve
我编写了以下代码来生成一个素数数组,直到数字 'num'。 但它给出了完全出乎意料的结果。 我尝试在 chrome 上调试它,但调试器没有多大帮助,因为它只是跳过了第 4 行。
function Sieve(num) {
var arr = Array.from({length:num-1}).map((x,i)=> i+2);
var numb = Math.floor(Math.sqrt(num));
var arra = Array.from({length:numb-1}).map((x,i)=> i+2);
arra.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y=!x)));
console.log(arr);
}
Sieve(10)
这应该是埃拉托色尼筛法算法吗?顺便提一下,你知道这不是生成素数的最快方法吗?
Bersteins's primegen 确认速度更快,它们可能是更快的解决方案。
除此之外,让我们显示您要实现的目标的简单代码:
var eratosthenes = function(n) {
// Eratosthenes algorithm to find all primes under n
var array = [], upperLimit = Math.sqrt(n), output = [];
// Make an array from 2 to (n - 1)
for (var i = 0; i < n; i++) {
array.push(true);
}
// Remove multiples of primes starting from 2, 3, 5,...
for (var i = 2; i <= upperLimit; i++) {
if (array[i]) {
for (var j = i * i; j < n; j += i) {
array[j] = false;
}
}
}
// All array[i] set to true are primes
for (var i = 2; i < n; i++) {
if(array[i]) {
output.push(i);
}
}
return output;
};
这更容易理解并分成几个部分。
顺便说一句,你知道 Array.from(new Array(n-1), (x,i) => i+2);
有用吗?不需要先array.from()
再.map()
,可以直接将map函数作为参数传给from。此外,新的 Array(n) 代码更具可读性。
这是使用您的原则的解决方案。
function Sieve(num) {
var arra = Array.from(new Array(num-1), (x,i) => i+2);
var comb = Array.from(new Array(Math.sqrt(num)-1), (x,i) => 2+i);
comb.forEach(x => arra=arra.filter(y => (y%x !== 0) || (y===x) ));
console.log(arra);
}
Sieve(100);
它在 CodePen 上,因为 JSFiddle 坏了。 labda solution to Erathostene's sieve