引子:
例1:求1+2+....+n.
- 循环(模拟计算过程):时间复杂度O(n)
int s = 0;
for(int i = 1; i <= n; i++) s = s + i; - 数学模型(高斯求和):时间复杂度为O(1)
S = n(n+1)/2
例2:求1-2+3-4.....+(-1)^(n-1)n.
- 数学模型:Sn = Sn-1 + (-1)^(n-1)n
int s = 0; for(int i = 1; i <= n; i++) { sign = -1 * sign; s = s + sign * i; }
时间复杂度:O(n)
例3:求1-3+5-7......(-1)n-1(2n-1).
- 数学模型:Sn = Sn-1 + (-1)n-1(2n-1)
int s = 0; for(int i = 1; i <= n; i++) { sign = -1 * sign; s = s + sign * (2*i-1); }
时间复杂度:O(n)
例4:1!-3!+5!-7!.....(-1)(n-1)(2n-1)!
- 数学模型:Sn = Sn-1 + (-1)n-1(2n - 1)! 或 Sn = Sn-1 + (-1)n-1|Sn-1|x(2n-2)x(2n-1)
- 描述:
int s = 0; for(1到2n-1) { 求2n-1阶乘; 判断是正还是负后赋值给t; s = s + t; }
- 实现一:效率低
int s = 0, signal = -1; for(int i = 1; i <= n; i++) { int t = 1; for(int j = 2; j <= 2*n - 1; j++) t = t * j; //求阶乘 signal = - signal; //正负交替 s = s + signal*t; //求和 }
时间复杂度:O(n2)
- 实现二:Sn = Sn-1 + (-1)n-1|Sn-1|x(2n-2)x(2n-1) 效率较高
int s = 0, signal = -1, t = 1; for(int i = 1; i <= n; i++) { if(i > 1) t = t*(2*n-2)*(2*n-1); //求2n-1的阶乘 signal = - signal; //正负交替 s = s + signal*t; //求和 }
时间复杂度:O(n)
例5:小试牛刀>>>求>>> Sn = 1 / 1! - 1 / 4! + 1 / 7!..... 1 / [ (-1)(n-1)(3n-2)! ]的n项和Sn。
- input描述:输入站一行,仅输入一个正整数n,可输入多组数据。
- output描述:输出n对应的Sn的值(每组数据的输出占一行)。
- 五组测试数据:(试着做一做在看答案O)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>参考答案☜