在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等。在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方法,很快可以做出来。这类算法叫做----级数算法。
级数计算的关键是“描述出通项”,而通项的描述法有两种:一为直接法、二为间接法又称递推法。
直接法的要领是:利用项次直接写出通项式;递推法的要领是:利用前一个(或多个)通项写出后一个通项。
可以用直接法描述通项的级数计算例子有:
(1)1+2+3+4+5+……
(2)1+1/2+1/3+1/4+1/5+……等等。
可以用间接法描述通项的级数计算例子有:
(1)1+1/2+2/3+3/5+5/8+8/13+……
(2)1+1/2!+1/3!+1/4! +1/5!+……等等。
(1)直接法求通项
打个比方,我写段代码:
例1、求1+1/2+1/3+1/4+1/5+……+1/100的和。
#include <stdio.h>
int main(void)
{
float s; int i;
s=0.0; //程序中是利用项次的倒数直接描述出每一项,并进行累加。注意:因为是整数,所以分子必须写成浮点数1.0的形式
for(i=1;i<=100;i++)
{
s=s+1.0/i ;
}
printf("1+1/2+1/3+...+1/100=%f\n",s);
return 0 ;
}
运行结果:

例2:间接法求通项
这种方法也叫做递推法
例如:
计算下列式子前20项的和:1+1/2+2/3+3/5+5/8+8/13+……。
#include <stdio.h>
int main(void)
{
float sum,fz,fm,t,fz1; int i;
sum=1; /*先将第一项的值赋给累加器s*/
fz=1;fm=2;
t=fz/fm; /*将待加的第二项存入t中*/
for(i=2;i<=20;i++)
{
sum=sum+t;
/*以下求下一项的分子分母*/
fz1=fz; /*将前项分子值保存到fz1中*/
fz=fm; /*后项分子等于前项分母*/
fm=fz1+fm; /*后项分母等于前项分子、分母之和*/
t=fz/fm;
}
printf("1+1/2+2/3+...=%f\n",sum);
}运行结果:

例三:计算级数
的值,当通项的绝对值小于eps时计算停止。
#include <stdio.h>
#include <math.h>
//求出最终的结果
float result(float x,float eps);
int main(void)
{
float x,eps;
scanf("%f%f",&x,&eps);
printf("\n%f,%f\n",x,result(x,eps));
return 0 ;
}
float result(float x,float eps)
{
int n=1;float s,t;
s=1; t=1;
do { //以下t为递推算法部分
t=t*x/(2*n);
s=s+(n*n+1)*t;
n++;
}while(fabs(t)>eps);
return s;
}
运行结果:
