#include<stdio.h>
#include<stdlib.h>
double fun(int );
int main()
{
int n;
double s;
printf("输入一个正整数");//大于1但小于100
scanf("%d",&n);
s=fun(n);
printf("%.6f",s);
return 0;
}
double fun(int n)
{
double sn;
int i,t;
t=1;
for(i=1;i<=n;i++){
int j;
for(j=1;j<=i;j++){
t*=j;
}
sn+=1.0/t;
}
return sn;
}
(1)n较大时,fun函数中的t仍然是int类型,计算结果超出int数据类型范围了,把t也改成double类型。
(2)你的fun函数代码逻辑应该是有问题,需要在第二层for循环之前,把t重置为1;也就是把t=1放在第二层for循环之前。
(3)fun函数中sn 没有初始化就用了,需要先初始化为0
代码修改如下(修改部分有注释):
double fun(int n)
{
double sn=0,t; //(1)t改成double类型,sn初始化为0
int i;
for(i=1;i<=n;i++){
t=1; //(2) t=1放在这里,这样才能保证每次计算的都是i的阶乘
int j;
for(j=1;j<=i;j++){
t*=j;
}
sn+=1.0/t;
}
return sn;
}
你的t也应该是double类型的,这样t在连乘的时候就不会超出范围了
改之后
#include<stdio.h>
#include<stdlib.h>
double fun(int );
int main()
{
int n;
double s;
printf("输入一个正整数");//大于1但小于100
scanf("%d",&n);
s=fun(n);
printf("%.6f",s);
return 0;
}
double fun(int n)
{
double sn;
int i;
double t;
t=1;
for(i=1;i<=n;i++){
int j;
for(j=1;j<=i;j++){
t*=j;
}
sn+=1.0/t;
}
return sn;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!