首先考虑计算e的近似值,使用公式:e=1+1/1!+1/2!+1/3!+……("/"表示除)。
代码如下:
/*计算e的近似值*/
#include<stdio.h>
main(){
int i,j,a,b=1;
float d=1;
printf("请输入公式中的n值:");
scanf("%d",&a);
for(i=1;i<=a;i++){
for(j=1;j<=i;j++){
b*=j;
}
d+=1.00/b;
b=1;
}
printf("e值为:%.2f\n",d);
return 0;
}
再考虑计算e^m的近似值,使用公式:e^m=1+m/1!+m^2/2!+m^3/3!+…… 。
代码如下:
#include<math.h>
main(){
int i,j,n,m,c=1;
float d=1;
/*n值即泰勒公式中的n值用于确定精确度*/
printf("请输入n值:\n");
scanf("%d",&n);
/*m值即次方数*/
printf("请输入m值:\n");
scanf("%d",&m);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
c*=j;
}
d+=pow(m,i)/c;
c=1;
}
printf("e^m的值为%.2f",d);
}
对于以上两个简单的程序,注意一下几点:
1、这里都是将数学中的展开式用于程序设计中,像求e的近似值,乍一看可能觉得无从下手,但用数学式子一展开,就很清晰明了;
2、这里两个程序中的整数阶乘值的计算正常应该封装在函数中,增强代码复用性;
3、两个代码中的n值对应两个展开式中的n值,可以调控近似值的精度,n值给的越大,显示近似值时要求的小数位越多,越精确;
4、这里还有一个c语言中的类型转换的问题,像第一个程序中,"d+=1.00/b”一句就很值得玩味。左侧的d肯定设置为float类型,而右侧的1.00若改为1,当然是不行的,两个整数相除将截去计算结果的小数部分,这样最终结果将一直是2.00;而当将1改为1.00后,右侧就变成了一个浮点数除以一个整数,而c编译器只知道怎样计算操作数数据类型相同的表达式,这样这个相除的过程就会存在一个类型提升,即拷贝b的值并将拷贝值提升为float类型后再进行相除,这样得到的结果是正确的浮点数。前述的类型提升也称为隐式转换,还有一种显式转换,像此处,使用"d+=(float) 1/b”结果也是完全正确的;
5、使用4中的理论,第二个代码中的"d+=pow(m,i)/c;"一句看似有点问题,它好像没有进行显式或隐式的类型转换,但结果却是正确的。事实上,pow()函数的返回值是double类型的,因此,这里也是进行了隐式的类型转换。