计算下列多项式的值:
从键盘上输入50后,输出为1.718282。
方法一:把上面多项式中的每一个分项标上记号,第1个式子的记号为1,第2个式 子的记号为2,第3个式子的记号为3……,依此类推。分母与记号间的关系如下:
项目 | 1 | 2 | 3 | 4 | 5 | … |
---|---|---|---|---|---|---|
分母 | 1 | 1×2 | 1×2×3 | 1×2×3×4 | 1×2×3×4×5 | … |
1! | 2! | 3! | 4! | 5! | … |
由表格可以发现,每一项分式的分母都是对应项标记的阶乘。所以只要求出每一项的阶乘再将其倒数和加在一起即为所求多项式的结果。
方法二:整体去看每一个分式之间的联系,每一个分式用一个字母来代替,第一个分式用t1表不,第二个分式用t2表示,分式之间的联系如下:
项目 | 1 | 2 | 3 | 4 | … |
---|---|---|---|---|---|
分式 | t1=1/1 | t2=1/(1×2) | t3=1/(1×2×3) | t4=1/(1×2×3×4) | … |
t1=1×1 | t2=t1×(1/2) | t3=t2×(1/3) | t4=t3×(1/4) | … |
由表可以看出,后面一项等于前一项乘以当前项数的倒数,如果这里的每一项都 用同一个变量t表示的话,那么第i项就可以用一个公式表示,即t=t*l/i。这样可以只用一层循环来实现,循环变量i控制对应的项数,取值范围为1〜n。
n 的阶乘算法如下:n!=1×2×3×4×5×……×n,可用循环来实现,代码如下:
对于每一项都是求出其分母即项数i对应的阶乘,是一个循环重复的过程,所以可用另外一层循环来控制项数,范围为1〜n。
对于存储阶乘的变量t,每一次记录新的阶乘之前都要把其值赋为1,否则下一项的阶乘值会受上一项的影响,所以在每次执行内层循环求下一项阶乘之前,要把t的值再次赋为1:t=1。
方法二的算法分析此处省略,后面给出相关程序。
下面是方法一的完整代码:
#include<stdio.h>
int main()
{
double s=0, t; /*s记录多项式的和、t记录每一项分式的分母*/
int i, n, j; /*n控制项数*/
printf("please input the number of n:"); /*输入n的值*/
scanf("%d", &n);
for(i=1; i<=n; i++) /*i控制对应项数*/
{
t=1; /*每次循环之前给t赋初值*/
for(j=1; j<=i; j++)
t = t * j; /*求每一项的阶乘*/
s = s + 1/t;
}
printf("%f\n", s);
return 0;
}
下面是方法二的完整代码:
#include<stdio.h>
int main()
{
double s=0, t=1;
int i, n;
printf("please input the number of n:");
scanf("%d", &n);
for(i=1; i<=n; i++)
{
t = t * 1 / i;
s = s + t;
}
printf("%f\n", s);
return 0;
}
它们的运行结果都是:
please input the number of n:50↙
1.718282