计算两个整数之间所有数字的和

7

目标

给定一个数组中的两个数字,求这两个数字之间(包括这两个数字)所有数字的和(例如 [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]);

我的问题

  1. 有没有更高效的方法来做这件事?
  2. 如何在数组中使用Math.max()和Math.min()?

1
你正在尝试找到算术级数元素的总和。有一个公式可以做到这一点,不需要循环。 - hugomg
一种优雅的方法是使用jQuery。 - Ritesh Karwa
2
@RiteshK 我甚至无法确定你是否更加认真,因为你错得不能再错了。 - Etheryte
4个回答

23

最优算法

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

2
哦,天才高斯本人在JavaScript中,我正要提交这个。 - dbarnes
谢谢您,看起来我需要复习一下算法 :) - jonplaca
高斯是十岁时意识到这一点的吗?@dbarnes - Tobias
sumAll(1,0) 怎么解决?当 1 + 0 等于 1 时,它返回 0。 - user13198697

14
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);

我将把这个答案标记为正确答案,因为我要求使用Math.min和Math.max的示例。 - jonplaca

2

前n个整数(从1到n,包括1和n)的和可以用公式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

现在我们有一个通用的公式来计算总和。如果我们要对一个大范围进行求和(例如从一百万到二百万),这将更加高效。


0
这是一个使用es6的一行递归程序解决方案的SumAll。
const SumAll = (num, sum = 0) =>  num - 1 > 0 ? SumAll(num-1,sum += num) : sum+num;
console.log(SumAll(10));

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接