直接算 1/1!+1/2!+1/3!+1/4!+1/5!,会有5次除法,精度无法保证。
应该做如下转换
s=1/1!+1/2!+1/3!+1/4!+1/5!=(1/1!+1/2!+1/3!+1/4!+1/5!)*5!/5!=(5!/1!+5!/2!+5!/3!+5!/4!+5!/5!)/5!=(P(5,4)+P(5,3)+P(5,2)+P(5,1)+P(5,0))/5!
其中P(n,m)=n!/(n-m)!=n*(n-1)*...*(n-m+1)
这样转换后只有一次除法,精度更高。
很简单,自己做吧。有什么问题可以提出来,不过不要让我们全权代劳。
#include
int fac(int n)
{
int m=1;
for(int i=1; i<=n; i++)
m=m*i;
return m;
}
int sum(int d)
{
double s=0;
for(int i=1; i<=d; i++)
s=s+1.0/fac(i); //1.0是为了转换成double类型
return s;
}
int main()
{
double s;
s=sum(5);
printf("s=%f", s);
return 0;
}