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哇,非常感谢你的解释,真的很有帮助。谢谢你的时间。现在我的想法(最初)就行了如果你可以从数组中划掉一个元素(这样你就不能使用它),但仍然保留它作为索引(如视频中)。非常感谢。你的解释很棒,写得很好,希望你能包括示例。