这是一道C语言基础题,求大神!该怎么解决

这是一道C语言基础题,求大神!
这是一道C语言基础题,求大神!该怎么解决
上图是题目,下面是我的源代码,为啥计算结果是错的。没有语法错误。
#include <stdio.h>
double fact(double n)
{
double sum=0;int i;
for(i=1;i<=n;i++)
sum+=i;
return sum;
}
double pow(double a, double b)
{
     int i;
     int result  = 1;
     for (i = 1; i<=b; i++)
         result *=a;
     return result;
 }

double cal(double m,double n)
{
double y;
y=pow(m,n)/fact(n);
return y;
}
void main()
{
double n;double x;double y;
scanf("%lf%lf",&x,&n);
y=1+cal(x,n);
printf("f(x)=%lf",y);
}
------解决方案--------------------

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

int fact(int n)
{
return (n * (n + 1)) >> 1;
}

double calc(double x, int n)
{
return pow(x, n) / fact(n);
}

int main()
{
int n;
double x, result = 1.0;

scanf("%d%lf", &n, &x);

while (n > 0)
{
result += calc(x, n--);
}

printf("%lf\n", result);
}

------解决方案--------------------

#include <stdio.h>
double fact(double n)//改成double fact(int n)
{
double sum=0;int i;
for(i=1;i<=n;i++)//n如果是double型, i<=n 会存在问题
sum+=i;
return sum;
}
double pow(double a, double b)//改成double pow(double a, int b)
{
     int i;
     int result  = 1;//改成double result = 1.0
     for (i = 1; i<=b; i++)
         result *=a;
     return result;
 }

double cal(double m,double n)
{
double y;
y=pow(m,n)/fact(n);
return y;
}
void main()
{
double n;double x;double y;
scanf("%lf%lf",&x,&n);
y=1+cal(x,n);
printf("f(x)=%lf",y);
}


1 楼的 int fact(int n)存在溢出风险
可以改成

int fact(int n)
{
if((n&1)==0)
return (n>>1)*(n+1)
else
return ((n+1)>>1)*n;
}

引用:

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

int fact(int n)
{
return (n * (n + 1)) >> 1;
}

double calc(double x, int n)
{
return pow(x, n) / fact(n);
}

int main()
{
int n;
double x, result = 1.0;

scanf("%d%lf", &n, &x);

while (n > 0)
{
result += calc(x, n--);
}

printf("%lf\n", result);
}

------解决方案--------------------
注意数据类型的大小,还有运算结果的精度/误差。
------解决方案--------------------
语法错误已经改过来了,以下是完整程序
#include <stdio.h>
double fact(int n)
{
double sum=0;
int i;
    for(i=1;i<=n;i++)
sum=sum+i;
    return sum;
}
double pow(double a, int b) //在循环中,b的数据类型一般是int
{
int i;
    double result  = 1;//在循环中,result与a的乘积也是保存在result中的,所以其数据类型和a是一样的,是double
    for (i = 1; i<=b; i++)
result=result*a;
    return result;
}
double cal(double m,int n)//这里n的数据类型也是int
{
double y;
    y=pow(m,n)/fact(n);
    return y;

void main()
{
int n,i;
double x;
double y=1.0;
    scanf("%lf %d",&x,&n);
for(i=1;i<=n;i++)//cal(double m,int n)这个函数只是计算m的n次方/(1+2+…+n),要计算这些项的和,还要在后面加一个循环
y=y+cal(x,i);
    printf("f(x)=%lf",y);
printf("\n");