求和两个整数之间的所有数字

时间:2015-05-21 23:34:29

标签: javascript

目的

给定数组中的两个数字,将所有数字相加,包括(和之间)两个整数(例如[4,2] - > 2> 3 + 4 = 9 )。

我设法解决了这个问题,但想知道是否有更优雅的解决方案(特别是使用Math.max和Math.min) - 请参阅下面的更多问题...

我的解决方案

//arrange array for lowest to highest number
function order(min,max) {
  return min - max;
}


function sumAll(arr) {
  var list = arr.sort(order);
  var a = list[0]; //smallest number
  var b = list[1]; //largest number
  var c = 0;

  while (a <= b) {
    c = c + a; //add c to itself
    a += 1; // increment a by one each time
  }

  return c;
}

sumAll([10, 5]);

我的问题(S)

  1. 有更有效的方法吗?
  2. 我如何将Math.max()和Math.min()用于数组?

4 个答案:

答案 0 :(得分:16)

最佳算法

function sumAll(min, max) {
    return ((max-min)+1) * (min + max) / 2;
}

答案 1 :(得分:10)

var array = [4, 2];
var max = Math.max.apply(Math, array); // 4
var min = Math.min.apply(Math, array); // 2

function sumSeries (smallest, largest) {
    // The formulate to sum a series of integers is
    // n * (max + min) / 2, where n is the length of the series.
    var n = (largest - smallest + 1);
    var sum = n * (smallest + largest) / 2; // note integer division

    return sum;
}

var sum = sumSeries(min, max);
console.log(sum);

答案 2 :(得分:2)

前n个整数(1到n,包括1)的总和由公式n(n + 1)/ 2给出。这也是第n个三角形数字。

         S1 = 1 + 2 + ... + (a-1) + a + (a+1) + ... + (b-1) + b
            = b(b+1)/2
         S2 = 1 + 2 + ... + (a-1)
            = (a-1)a/2
    S1 - S2 = a + (a+1) + ... + (b-1) + b
            = (b(b+1)-a(a-1))/2

现在我们有一个计算总和的通用公式。如果我们总结大范围(例如100万到200万),这将更有效率。

答案 3 :(得分:0)

这是使用es6的SumAll的单线程递归程序解决方案。

const SumAll = (num, sum = 0) =>  num - 1 > 0 ? SumAll(num-1,sum += num) : sum+num;
console.log(SumAll(10));
  

注意::虽然最好的例子是使用算法,如上所述。   但是,如果以上可以改进。

相关问题