关于展开式求和的问题,如何解决?

展开式求和:s=(x^0)/0!+(x^1)/1!(x^2)/2!+.到最后一项的绝对值小于0.00001,结果保留四位小数。

#include
#include
int fact(int n)
{
    double result;
    if(n==1||n==0)
    {
        result=1;
        
    }else
    {
        result=n*fact(n-1);
    }
    return result;
}
int main(void)
{
    int i=0;
    double k,sum=0,x;
    printf("Enter x:");
    scanf("%d",&x);
    k=(pow(x,i))/fact(i);
    while(fabs(k)>=0.00001)
    {
        sum+=k;
        i++;
        k=(pow(x,i))/fact(i);
    }
    printf("s=1+x+x^2/2!+....=%.4lf\n",sum);
    
    return 0;
}


img

不管输什么x,结果都不变,大家帮我看看那出错了

应该是因为scanf()函数的格式转换符不对和fact函数的返回值的数据类型不对,理由如下:

因为x为double类型,所以需要把scanf()函数里的格式转换符%d改为%lf;

然后把fact函数的返回值换为double类型的原因是,因为阶乘的结果会很大,可能会超过int类型的取值范围,所以改为double更合适。

修改如下:

#include<stdio.h>
#include<math.h>
double fact(int n)
{
    double result;
    if(n==1||n==0)
    {
        result=1;
        
    }else
    {
        result=n*fact(n-1);
    }
    return result;
}
int main(void)
{
    int i=0;
    double k,sum=0,x;
    printf("Enter x:");
    scanf("%lf",&x);
    
    k=(pow(x,i))/fact(i);
  //  printf("x=%d,pow(10,1)=%f\n ",x,pow(10,1));
    //printf("first,pow(%d,%d)=%f,fact(%d)=%f, k=%f\n",x,i,pow(x,i),i,fact(i),k); 
    while(fabs(k)>=0.00001)
    {
        sum+=k;
        i++;
        k=(pow(x,i))/fact(i);
       // printf("pow(x,i)=%f\n",pow(x,i));
       // printf("第%d次, k=%f\n",i+1,k); 
    }
    printf("s=1+x+x^2/2!+....=%.4lf\n",sum);
    
    return 0;
}
 
 

img


#include<stdio.h>
#include<math.h>
int fact(int n)
{
    double result;
    if(n==1||n==0)
    {
        return result=1; // 加 return 
        
    }else
    {
        result=n*fact(n-1);
    }
//    return result;不需要,if 和 else 已经有了 
}
int main(void)
{
    int i=0;
    double k,sum=0,x;
    printf("Enter x:");
    scanf("%d",&x);
    k=(pow(x,i))/fact(i);
    while(fabs(k)>=0.00001)
    {
        sum+=k;
        i++;
        k=(pow(x,i))/fact(i);
    }
    printf("s=1+x+x^2/2!+....=%.4f\n",sum);//输出用 %.4f 
    
//    return 0; int main(void) 就不需要了 ,如果是 int main() 就需要返回值 
}

要改的太多了,你先看看这个吧

#include<stdio.h>
#include<math.h>

double fact(int n)//定义fact()即阶乘,看起来更方便清楚
{
  double sum=1;//叠乘设一,叠加设零
  if(n==0){
      return sum=0;
   }
   else{
   while(n>0){//循环成立条件
       sum=sum*n;
       n--;
   }//从n开始叠乘,n!=n*(n-1)*(n-2)*。。。。*1
   return sum;//返回到原值,刚才设什么返回什么,这边不能return 0
   }
}

void main()
   {
   double fact(int n);
   int i;
   double x,s;
   while(scanf("%lf",&x)!=EOF)
   {
   i=1;
   s=0;
  while(pow(x,i)*1.0/fact(i)>=0.00001)//满足成立条件,前提
  {
    s+=pow(x,i)*1.0/fact(i);//即s=s+pow(x,i)*1.0/fact(i)
     i++;//1,2,3数字不断增大
   }//本次循环结束,要输出s的值
   printf("%.4f",s);
   }
}