累加:S(N)=S(N-1)+a;
累乘: S(N)=S(N-1)*a;
ey:求:1/1!-1/3!+1/5!-1/7!+...+(-1)^(n+1)/(2n-1)!
分析:这个问题既有累加也有累乘,
数学模型:S(N)=S(N-1)+(-1)^(n+1)/(2n-1)!
算法模型:
1.求阶乘:
for(i=2;i<=n;i++)
{
t=1;
for(j=1;j<=2*i-1;j++)
t=t*j;
}
上面是(2n-1)!,类似的还有n!,(2n+1)!,也就是j的比较条件不同,用双层循环解决。这里面就不介绍递归了。
2.求(-1)^(n+1):
这个就是一个旗帜,遇到偶数项时就是-1;奇数项就是+1,;
用循环:
sign=1;//n=1时
for(j=1;j<=i+1;j++)
sign=sign*(-1);//sign=-sign;
3.求和s:
int s=1;
在内层循环里面:
s=s+sign/t;
完整代码:
input(n);
float s=1,t=1;
int i,j;
int sign=1;
for(i=2;i<=n;i++)
{
for(j=1;j<2*i-1;j++)
t=t*j;
for(j=1;j<i+1;j++)
sign=sign*(-1);
s=s+sign/t;
}
print(n);
算法分析:
算法时间复杂度是O(N^2),效率太低,
原因分析:1.当第一次求出3!,再求5!就没有必要去从1累乘到5,而是可以从3!*4*5,就是可以,
数学模型:A(N)=A(n-1)*1/(2n-2)*1/(2n-1)
2.sign=-sign;也可以减少循环。n*(n-1)/2次
对(-1)^(n+1)可以用一个变量sign记录他的值,每循环一次执行sign=-sign;
改进代码:
int i;
float s=1,t=1;
input(n);
for(i=2;i<n;++i)
{
sign=-sign;
t=t*(2*i-2)*(2*i-1);
s=s+sign/t;
}
print(s);
算法分析:算法时间复杂度是O(n).