用c语言求s=1/1!+1/2!+1/3!+1/4!+1/5! 要用到函数的嵌套调用 记得看清楚 是1除以阶层

如题所述

直接算 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)
这样转换后只有一次除法,精度更高。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-26
很简单,自己做吧。有什么问题可以提出来,不过不要让我们全权代劳。
第2个回答  2012-11-26
#include <stdio.h>

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;
}追问

有一个错误

追答

double sum(int d)
{
double s=0;
for(int i=1; i<=d; i++)
s=s+1.0/fac(i); //1.0是为了转换成double类型
return s;
}
sum返回值类型搞错了,改成double类型

追问

还是有错误

追答

#include
int fac(int n)
{
int i,m=1;
for(i=1; i<=n; i++)
m=m*i;
return m;
}
double sum(int d)
{
double s=0;
int i;
for(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;
}

这样应该可以了,for循环里不能对i初始化,应该拿出来

本回答被提问者和网友采纳