需要帮助查找数组中所有数字的总和

时间:2015-06-27 02:28:36

标签: javascript arrays for-loop addition

我试图找到1000以下3或5的倍数的所有数字。在我得到所有数字之后,我想将它们加起来。

我能够弄清楚如何找到倍数并将它们添加到数组中,但无法弄清楚如何将它们添加到一起。

这是我的代码:

var add = [];
var count = 0;

if ( i % 3 == 0 || i %5 == 0) {
    for (var i = 1; i <= 1000; i ++) {
        add.push(i);
    }
};

function whole () {
    for(var i = 0 ; i <= add.length; i ++) {
        count = count + add[i];
    }
};

whole();

5 个答案:

答案 0 :(得分:2)

第一个循环不会发生,因为此时iundefined(i%3为NaN)。

我认为您只需要将for转换为if

for (var i = 1; i <= 1000; i ++) {
  if ( i % 3 == 0 || i %5 == 0) {
    add.push(i);
  }
};

您需要返回count的断言是不正确的。该功能只是作用于全球count

一种更干净,功能更纯粹的方法:

function whole(i, count, max){
  if(i > max){
   return count;
 }
 if(i % 3 === 0 || i % 5 === 0){
   return whole(i + 1, count + i, max);
 }
 return whole(i + 1, count, max);
}

whole(0, 0, 1000);

答案 1 :(得分:1)

你需要把条件放在循环中,让循环运行到i < 1000,因为你只想要数字低于1000。

for (var i = 1; i < 1000; i ++) {
    if (i % 3 == 0 || i %5 == 0) {
        add.push(i);
    }
}

在整个函数中,您需要运行ntil i < add.length,否则您将尝试在总和中添加未定义的索引。

function whole () {
    for(var i = 0 ; i < add.length; i ++) {
        count = count + add[i];
    }
};

答案 2 :(得分:0)

这是对数字数组求和的更好方法。

您可以在阵列上使用reduce功能获得“减少”值

add.reduce(function(x,y) { return x+y; }, 0);

例如((0 + 1) + 2) + 3将返回6

[1,2,3].reduce(function(x,y) { return x+y; }, 0); //=> 6

这是另一种有趣的方法,可以通过更具功能性的方法来解决问题。

  

它使用 ES6 ,但不要担心。您可以轻松地将示例复制/粘贴到babeljs.io/repl以查看其运行情况。 Babel也会给你相同的ES5。

// let's say we have an array of 1000 numbers
let ns = new Array(1000);

// fill the array with numbers
for (let i=0, len=ns.length; i<len; i++) {
  ns[i] = i+1;
}

// some reusable functions
let mod     = y => x => x % y;
let eq      = y => x => x === y;
let id      = x => x;
let filter  = f => xs => xs.filter(f);
let reduce  = f => i => xs => xs.reduce(uncurry(f), i);
let comp    = g => f => x => g(f(x));
let compN   = reduce(comp)(id);
let uncurry = f => (x,y) => f(x)(y);

// these are some helpers you could define using the reusable functions
let add = y => x => x + y;
let sum = reduce(add)(0);
let divisibleBy = x => comp(eq(0))(mod(x));

// define your solution as a composition
//   of `sum`, `divisbleBy(5)`, and `divisibleBy(3)`
let solution = compN([
  sum,
  filter(divisibleBy(5)),
  filter(divisibleBy(3))
]);

// output the solution passing in the original `ns` array
console.log(solution(ns));

答案 3 :(得分:0)

我认为你很亲密。在你的整个函数中,你需要返回计数。

function whole () {
   for(var i = 0 ; i <= add.length; i ++) {
       count = count + add[i];
   }
   return count;
};

答案 4 :(得分:0)

只需调用reduce而不启动参数。

  

arr.reduce(callback [,initialValue]):If no initialValue was provided, then previousValue will be equal to the first value in the array and currentValue will be equal to the second. MDN

add.reduce(function(x, y) { return x + y; });