6

这就是我想出的:

#include <stdio.h>

int main (void)
{
  int n, i, j;
  float e = 1.0, nFact = 1.0;

  printf ("please enter the number");
  scanf ("%d", &n);

  for (i = 1; i <= n ; i++)
  {
    for (j = 1; j <= i; j++)
    {
      nFact *= j;
    }
    e = e + (1.0 / nFact);
  }

  printf ("The value of 'e' is : %f", e);
  return 0;
}

这就是我从这段代码中得到的。输入:3 输出:2.58333(接近 2.6666...)

但是对于 n=3,e 应该给出 2.6666.. 作为一个值。

我在这里做错了吗?如何获得正确的输出?

4

3 回答 3

15

您在每次迭代中都不必要地计算阶乘。只需将内部循环替换为nFact *= i;.

#include<stdio.h>

int main (void)
{
int n,i,j;
float e=1.0, nFact=1;

printf("please enter the number");
scanf("%d", &n);

for( i =1; i<= n ; i++)
{
    nFact*=i;
    e = e + (1.0/ nFact);
}

printf("The value of 'e' is : %f", e);

return 0;
}
于 2012-09-13T09:13:26.200 回答
13

Am i doing something wrong here?

您忘记将阶乘变量设置为 1。因此,您的变量正在迅速变小。这使得 (1.0/nFact) 更小,这就是为什么你会变得更小 e。

nFact=1.0;     //add this line so it resets to 1.0 everytime a factorial is needed
for( j = 1  ; j <= i; j++)
{
    nFact *= j;
    e = e + (1.0/ nFact);
}
//only single loop is more than enough

您正在通过 O(n) 复杂度获得阶乘。为什么不保存旧值并在每次迭代中使用它?(O(1)--->不需要阶乘循环。只需使用旧值,因为您没有重置它。(只需乘以 i)

how can i get the proper output?

在第 11 次或第 12 次迭代之后,您float不会给出足够的精度分辨率最小步骤。Double或者BıgDecimal如果你追求科学似乎更好。

于 2012-09-13T09:13:14.500 回答
2

该循环非常低效:注意您的内部循环如何一遍又一遍地计算相同的东西!

相反,您应该保留一个正在运行的术语并对其进行更新:

double term = 1;
double result = term;

for (unsigned int i = 1; i != n; ++i)
{
    term /= i;
    result += term;
}

printf("With %u steps we compute %f.\n", n, result);
于 2012-09-13T09:21:18.873 回答