此代码用于通过添加反因子来计算数学常数 e :
#include <stdio.h>
void main()
{
int i, n,a;
float result=1;
float sum;
a=1;
sum=0;
printf("Enter a number:\n");
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
result=result*i;
sum = a + (i/result);
}
printf("%.2f is the answer\n",sum );
}
而不是给出 e 的值,它产生inf is the answer
。
为什么我得到inf
而不是2.78
?
答案 0 :(得分:3)
您提到的错误源于您要除以0
。
你说你试图找到阶乘的总和,但你做了
sum = 1 + 0/0
sum = 1 + 1/0
sum = 1 + 2/0
...
sum = 1 + n/0
而不是
sum = 0! + 1! + 2! + ... + n!
错误数量惊人!你不执行总和,你为每个不应该有任何项的术语引入了一个因子,你使用了阶乘而不是阶乘的内部,你添加了1
,其中不应该有任何,并且你错误地计算了因子,因为你使0!
等于0
而不是1
。
替换
result=result*i;
sum = a + (i/result);
与
if (i)
result=result*i;
sum = sum + result;
一个更简单的解决方案,它使用第一个项对变量进行种子处理,然后从第二个项开始循环。以下是使用更好的变量名称的解决方案:
int N;
int n;
int n_fact = 1;
int sum = 1;
printf("Enter the number of terms: \n");
scanf("%d", &N);
for (n=1; n<N; ++n) {
n_fact *= n;
sum += n_fact;
}
[我原本以为你试图计算 e 。如果情况确实如此,我将在这里留下原来的答案。]
您提到的错误源于您要除以0
。
您似乎正在尝试近似 e ,但您确实
e = 1 + 0/0
e = 1 + 1/0
e = 1 + 2/0
...
e = 1 + n/0
而不是
e = 1/(0!) + 1/(1!) + 1/(2!) + ... + 1/(n!)
你犯了很多错误!你没有执行总和,你为每个不应该有的术语引入了一个因子,你添加了1
不应该有的因素,并且你因为你0!
而错误地计算了因子等于0
而不是1
。
替换
result=result*i;
sum = a + (i/result);
与
if (i)
result=result*i;
sum = sum + (1/result);
一个更简单的解决方案,它使用第一个项对变量进行种子处理,然后从第二个项开始循环。以下是使用更好的变量名称的解决方案:
int N;
int n;
int n_fact = 1;
float e = 1;
printf("Enter the number of terms: \n");
scanf("%d", &N);
for (n=1; n<N; ++n) {
n_fact *= n;
e += 1 / n_fact;
}