Javascript 素数,需要一点帮助吗 背景信息:
所以我试图计算一个数中的所有素数,然后求和Javascript 素数,需要一点帮助吗 背景信息:,javascript,arrays,primes,Javascript,Arrays,Primes,所以我试图计算一个数中的所有素数,然后求和sumPrimes(10)应该返回17,因为2+3+5+7=17 挑战就在这里--> 我添加了一些控制台。登录,只是为了显示发生了什么 我的做法: 我的做法是尝试在这里复制本教程,但代码如下: 我用我的代码尝试的是将数字从2分割成一个数组,直到你的数字是什么(1不是素数)10看起来像[2,3,4,5,6,7,8,9,10]。然后,我使用另一个for循环和i从之前的数组arr中选择一个数字,将其添加到prime,然后使用单独的循环从数组(arr)中删除该
sumPrimes(10)
应该返回17
,因为2+3+5+7=17
挑战就在这里-->
我添加了一些控制台。登录,只是为了显示发生了什么
我的做法:
我的做法是尝试在这里复制本教程,但代码如下:
我用我的代码尝试的是将数字从2分割成一个数组,直到你的数字是什么(1不是素数)<代码>10
看起来像[2,3,4,5,6,7,8,9,10]
。然后,我使用另一个for
循环和i
从之前的数组arr
中选择一个数字,将其添加到prime
,然后使用单独的循环从数组(arr
)中删除该数字的每一个倍数。当我回去找另一个数字时,我们已经知道它是素数了
剩下的就是如果你不明白的话
示例:
该数组的第一个数字是2。因此,我将2添加到prime
素数的当前值:2
然后过滤掉任何多个。因为我是在我的j
循环中按数字本身计数的,所以我已经知道任何数字都是倍数。它还将从数组中删除我已经存在的素数及其所有倍数,这样它就永远不会被未定义
arr的当前值(希望):[3,5,7,9]
etc(接着是3、5和7)
出了什么问题?
它并没有消除所有的倍数。我使用的是拼接
,我不认为它正确地删除了那个数字。帮忙
请不要只是给我一些ES6答案然后走开。我想坚持我的(嗯,视频的)想法。我不在乎你的答案有多短,只是我的答案有什么问题
repl-->
函数sumPrimes(num){
var素数=0;
var-arr=[];
对于(设i=2;i,正如大家已经指出的,您对splice()
的期望似乎不正确。请查看此处的MDN文档:
有两个问题:
该函数未正确删除值(从arr
)
删除值时,筛选器的循环逻辑不考虑数组长度的变化
这是使用拼接
删除值的方法:
这将创建一个数组的副本,从要取出的数组之后的索引开始
arrayTail = arr.slice(j + 1);
arrayHead = arr.splice(0,j);
这将提取数组中从开始到要取出的索引之前的所有元素
arrayTail = arr.slice(j + 1);
arrayHead = arr.splice(0,j);
最后,将这两部分合并在一起,得到过滤后的数组
arr = arrayHead.concat(arrayTail);
或者,您也可以使用Array.filter
功能:
arr = arr.filter(function(value){
// Filter all values that are divisible by the prime
return value % number != 0;
});
关于第二部分,请考虑:
arr = [1,2,3,4,5,6,7,8,9];
// You filter for multiples of 2
// And that's okay because all the values are indices offset by 2
arr = [1,2,3,5,9];
// You filter for multiples of 3
arr[2] == 3
arr[4] == 9
// But the multiples of 3 are no longer offset by 3
因此,与其聪明地使用索引,不如像平常一样循环遍历数组的其余部分,然后检查当前值是否是素数的倍数
if (arr[j] % number == 0) {
... your splice code
}
现在,这可能是不请自来的,听起来您只是在学习编程。我强烈建议您养成使用完整变量名的习惯,以便于阅读。此外,还包括许多注释,以突出显示您试图通过该编码块实现的逻辑
希望您能发现这是一个很好的例子:
function sumPrimes(num) {
var currentPrime = 0;
var arr = [];
var sumOfPrimes = 0;
// Create an array of potential primes
for (let i = 2; i <= num; i++) {
arr.push(i);
}
console.log("Prime array", arr);
// For every value in the array, remove any future multiples of it
for (let i = 0; i < arr.length; i++) {
var currentPrime = arr[i];
console.log("Prime: " + currentPrime);
sumOfPrimes += currentPrime;
console.log("Sum of Primes: " + sumOfPrimes);
// Remove multiples of prime
// Start at the next value in the array
// And loop till the end
for (let j = i + 1; j < arr.length; j++) {
// If the current value is a multiple of
// the prime, then remove it
if (arr[j] % currentPrime == 0) {
arrayTail = arr.slice(j + 1);
arr = arr.splice(0,j).concat(arrayTail);
j -= 1;
// Since you removed an element, you need to
// move the index back so it doesn't skip
// any checks
}
}
console.log("Filtered array for ", currentPrime, arr);
}
return "Final result: " + sumOfPrimes;
}
函数sumPrimes(num){
var currentPrime=0;
var-arr=[];
var sumOfPrimes=0;
//创建一个潜在素数数组
对于(设i=2;i,如果您只将一个参数传递给.splice()
,这意味着您希望删除该点之后的所有内容。“请不要只给我一些ES6答案就走开。”xDI仍然不确定如何从数组中删除一个元素(我可以在不使用另一个循环的情况下实现该元素)@Sali-lol当前版本的语言规范是第8版;-)当你从数组中拼接一个元素时,数组的其余部分向下移动一个索引,因此for(var j=number;j哇,非常感谢你的解释,真的很有帮助。谢谢你的时间。现在我的想法(最初)就行了如果你可以从数组中划掉一个元素(这样你就不能使用它),但仍然保留它作为索引(如视频中)。非常感谢。你的解释很棒,写得很好,希望你能包括示例。