有一个流传很广的故事,关于 高斯,数学家中的非凡人物,他有一位懒惰的老师。这位所谓的教育家想让学生们忙碌起来以便自己打个盹;他让全班同学计算从1加到100的和。
高斯很快给出了答案:5050。这么快?老师怀疑有作弊行为,但并非如此。手动加法是傻子才做的事,高斯找到了一个绕过问题的公式:
![]()
![]()
让我们分享几个关于这个结果的解释,并真正直观地理解它。对于这些例子,我们将计算从1加到10,然后看看它如何应用于1到100(或任意数字)。
技巧1:配对数字
配对数字是解决这个问题的常见方法。与其将所有数字写在一列中,不如把数字绕过来,像这样:
1 2 3 4 5
10 9 8 7 6
一个有趣的模式出现了: 每列的总和是11。随着第一行增加,第二行减少,因此和保持不变。
因为1与10(我们的n)配对,所以我们可以说每列的和为(n+1)。那么我们有多少对呢?嗯,我们有2行相等的行,因此必须有n/2对。
![]()
这就是上面的公式。
等等——如果有奇数个数字会怎样?
啊,我很高兴你提到这一点。如果我们计算从1加到9呢?我们就没有偶数个项目可以配对了。许多解释只会给出上述解释并就此打住。但我不会。
让我们计算从1加到9,但这次不从1开始,而是从0开始计数:
0 1 2 3 4
9 8 7 6 5
通过从0开始计数,我们得到了一个“额外项”(总共10个),这样我们就有偶数行了。不过,我们的公式会略有不同。
注意每列的和是n(不像之前是n+1),因为0和9被分在一组。而且我们不是正好有2行中的n个项(总共n/2对),而是有2行中的n+1个项(总共(n+1)/2对)。如果你将这些数字代入,你会得到:
![]()
这和之前的公式是一样的。我一直觉得奇怪的是,同一个公式既适用于奇数也适用于偶数——难道不会得到分数吗?是的,你会得到相同的公式,但原因不同。
技巧2:使用两行
上述方法可行,但你处理奇数和偶数的方式不同。难道没有更好的方法吗?有的。
与其将数字绕圈排列,不如将它们写成两行:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
注意我们有10对,每对加起来等于10+1。
以上所有数字的总和是
![]()
但我们只想要一行的总和,而不是两行。因此,我们将上述公式除以2得到:
![]()
这很酷(就数字行而言)。它对奇数或偶数个项同样适用!
技巧3:构造一个矩形
我最近偶然发现了另一种解释,一种对旧配对解释的新方法。不同的解释对不同的人更有效,我倾向于更喜欢这个。
与其写出数字,不如假设我们有豆子。我们想把1个豆子加到2个豆子、3个豆子……一直到5个豆子。
x
x x
x x x
x x x x
x x x x x
当然,我们可以加到10或100个豆子,但用5个你就能明白。如何计算我们金字塔中的豆子数量?
嗯,总和显然是1 + 2 + 3 + 4 + 5。但让我们换个角度来看。假设我们镜像我们的金字塔(我用“o”表示镜像的豆子),然后将其翻倒:
x o x o o o o o
x x o o x x o o o o
x x x o o o => x x x o o o
x x x x o o o o x x x x o o
x x x x x o o o o o x x x x x o
很酷吧?如果你想知道它是否“真的”对齐,确实如此。看一下常规金字塔的底部行,有5个x(和1个o)。金字塔的下一行少1个x(总共4个)和多1个o(总共2个)来填补空隙。就像配对一样,一侧在增加,另一侧在减少。
现在来解释:我们总共有多少豆子?嗯,那只是矩形的面积。
我们有n行(我们没有改变金字塔的行数),我们的集合宽度为(n + 1)个单位,因为1个“o”与所有“x”配对。
![]()
注意,这次我们不再关心n是奇数还是偶数——总面积公式同样适用。如果n是奇数,每行将有偶数个项(n+1)。
但当然,我们不想要总面积(x和o的数量),我们只想要x的数量。由于我们将x加倍得到o,所以x本身只是总面积的一半:
![]()
我们又回到了原来的公式。再次强调,金字塔中x的数量 = 1 + 2 + 3 + 4 + 5,即从1到n的和。
技巧4:取平均值
我们都知道
average = sum / number of items
我们可以将其重写为
sum = average * number of items
那么让我们来计算总和。如果我们有100个数字(1…100),那么我们显然有100个项。这很容易。
为了得到平均值,注意这些数字是均匀分布的。对于每个大数字,另一端都有一个小数字。让我们看一个小集合:
1 2 3
平均值是2。2已经在中间,1和3“相互抵消”,所以它们的平均值是2。
对于偶数个项
1 2 3 4
平均值介于2和3之间——是2.5。即使我们有一个分数平均值,这也没问题——因为我们有 偶 项目数量,当我们用平均值乘以计数时,那个丑陋的分数就会消失。
注意在这两种情况下,1 在平均值的一侧,而 N 在另一侧等距。所以,我们可以说整个集合的平均值实际上就是 1 和 n 的平均值:(1 + n)/2。
将其代入我们的公式
![]()
瞧!我们有了理解公式的第四种方式。
那么这有什么用呢?
三个原因:
1) 快速累加数字对估算很有用。注意,公式展开为:
![]()
假设你想把从 1 到 1000 的数字加起来:假设你的网站每天增加 1 个访客——1000 天后你总共有多少访客?由于 一千的平方等于一百万,我们得到 million / 2 + 1000/2 = 500,500.
2) 这种将 1 到 N 相加的概念也出现在其他地方,例如计算概率时用于 生日悖论。牢固掌握这个公式将有助于你在许多领域的理解。
3) 最重要的是,这个例子表明理解一个公式有多种方式。也许你喜欢配对法,也许你更喜欢矩形技巧,或者可能有其他适合你的解释。 不要放弃 当你无法理解时——试着寻找另一个有效的解释。数学快乐。
顺便说一下, 还有更多细节 关于这个故事的历史以及高斯可能使用的技巧。
变体
如果不是从1到n,而是从5到n呢?
从常规公式 (1 + 2 + 3 + … + n = n * (n + 1) / 2) 开始,减去你不想要的部分 (1 + 2 + 3 + 4 = 4 * (4 + 1) / 2 = 10)。
Sum for 5 + 6 + 7 + 8 + … n = [n * (n + 1) / 2] – 10
对于任意起始数 a:
Sum from a to n = [n * (n + 1) / 2] – [(a - 1) * a / 2]
我们想去除从 1 到 a-1 的所有数字。
如果是偶数呢,比如2 + 4 + 6 + 8 + … + n?
只需将常规公式加倍。要计算从 2 到 50 的偶数之和,先求 1 + 2 + 3 + 4 … + 25,然后加倍:
Sum of 2 + 4 + 6 + … + n = 2 * (1 + 2 + 3 + … + n/2) = 2 * n/2 * (n/2 + 1) / 2 = n/2 * (n/2 + 1)
所以,要得到从 2 到 50 的偶数之和,你计算 25 * (25 + 1) = 650
如果是奇数呢,比如1 + 3 + 5 + 7 + … + n?
这与偶数公式相同,只是每个数字比对应的数字少 1(我们有 1 而不是 2,3 而不是 4,以此类推)。我们取下一个最大的偶数 (n + 1),然后减去多余的 (n + 1)/2 个“-1”项:
Sum of 1 + 3 + 5 + 7 + … + n = [(n + 1)/2 * ((n + 1)/2 + 1)] – [(n + 1) / 2]
要计算 1 + 3 + 5 + … + 13,取下一个更大的偶数(n + 1 = 14)并执行
[14/2 * (14/2 + 1)] – 7 = 7 * 8 – 7 = 56 – 7 = 49
组合:偶数和偏移
假设你想要 50 + 52 + 54 + 56 + … + 100 中的偶数。找出所有偶数
2 + 4 + 6 + … + 100 = 50 * 51
然后减去你不想要的部分
2 + 4 + 6 + … 48 = 24 * 25
因此,50 + 52 + … + 100 的和 = (50 * 51) – (24 * 25) = 1950
呼!希望这能帮到你。
Ruby 极客:你可以用以下代码验证
(50..100).select {|x| x % 2 == 0 }.inject(:+)
1950
Javascript 极客:执行这个:
[...Array(51).keys()].map(x => x + 50).filter(x => x % 2 == 0).reduce((x, y) => x + y)
1950
// Note: There are 51 numbers from 50-100, inclusive. Fencepost!