先看规律:
规律是1开始的间隔最小的奇数数列``第偶数个数是负数
1 -3 +5 -7 +9 -11 +13 。。。。
一个很简单的规律:
如果是奇数个数(>=3个数),1后面相临的2个数加起来是2。
如果是偶数个数(>=2个数),从1开始,每个相临的数加起来为-2。
处理数据:
判断奇数或偶数很简单``最后一个数是正数就是奇数个,负的就是偶数个数,
接下来就是数数多少个数。
看最后一个数的绝对值|m|
根据:
2n+1 = |m| >> n = (|m|-1)/2 (n>=0, n为整数,并且n位偶数取负,n为奇数取正.)所以是(|m|-1)/2 + 1个数。
当 m > 0 , 也就是奇数个数时,1后面相临的数就有 (|m|-1)/2 + 1 - 1 个数。
也就是 (|m|-1)/2 个数, 就是 (|m|-1)/4 对数。因为每对为2,结果就是 (|m|-1)/2 + 1。
所以最后结果就是: 1和它后面的数的个数的和----其实就是总数的个数。
当 m < 0 , 也就是偶数个数时, 1开始的数就有 (|m|-1)/2 + 1
个数。
就是 (|m|-1)/4 + 1/2 对数, 因为每对为-2,结果就是
-( (|m|-1)/2 + 1) 。
所以最后结果就是: 总数的个数的相反数。
综合上面的两个结论: 给出一个数列 (2n+1) (n>=0, n为整数,并且n位偶数取负,n为奇数取正.)
对其求和,结果为就是项值(n+1).
所以``我们只要程序读入最后一个数M````就可以:
( m > 0 ) ? ( printf("%d", ( m-1 ) / 2 + 1 ) : ( printf("-%d", ( -m - 1 ) / 2 + 1 ) ;
很简单吧```
[[it] 本帖最后由 死了都要C 于 2008-3-10 10:11 编辑 [/it]]