这是一道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);
}
------解决方案--------------------
------解决方案--------------------
1 楼的 int fact(int n)存在溢出风险
可以改成
------解决方案--------------------
注意数据类型的大小,还有运算结果的精度/误差。
------解决方案--------------------
语法错误已经改过来了,以下是完整程序
#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");
}
上图是题目,下面是我的源代码,为啥计算结果是错的。没有语法错误。
#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 <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");
}