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 に答える