Cao Yi

求 1-2+3-4+…

返回目录

求下面数列所有元素之和:

1, -2, 3, -4, 5, -6, 7, ..., ±

即求值:

S(n) = 1 - 2 + 3 - 4 + 5 - 6 + 7 - ... ± n

观察以下计算结果:

S(1) = 1
S(2) = 1 - 2 = -1
S(3) = 1 - 2 + 3 = 2
S(4) = 1 - 2 + 3 - 4 = -2
S(5) = 1 - 2 + 3 - 4 +5 = 3
S(6) = 1 - 2 + 3 - 4 +5 -6 = -3
... ...

可见求和公式是:

S(n) = -n / 2, when n is an even number
S(n) = (n + 1) / 2, when n is an odd number

如上所述,用程序求解如下:

public int sumMinusPlus(int n) {
    return (n % 2 == 0) ? (-n / 2) : (n + 1) / 2 ;
}

还有一种比较巧妙的方法,无需用到 n % 2 == 0 这步条件判断。

注意 S(n) 的正负性和 n 的奇偶性的关系:当 n 为奇数时,S(n) > 0,当 n 为偶数时,S(n) < 0,所以,S(n) 的奇偶性可以表示为 (-1)^(n+1).

再观察 S(n) 的绝对值,它等于 (n + 1) / 2 向下取整。

所以,相关代码也可以写成这样:

public int sumMinusPlus(int n) {
    return ((-1)^(n + 1)) * Math.ceil((n + 1) / 2);
}

这其实是个非常著名的问题,参维基百科的内容