C语言求多项式之和
问题描述
计算下列多项式的值:从键盘上输入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,可用循环来实现,代码如下:
for (j=1; j<=i; j++) /*i 为对应的项数*/
t=t*j; /*t表示每一项的分母*/
对于存储阶乘的变量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