求下面数列所有元素之和:
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);
}
这其实是个非常著名的问题,参维基百科的内容。