2012-01-23 4 views
2

セリエ1 + 1/1の計算方法! + 1/2! + 1/3! + ... + 1/n! C++で?これにC++で数値eに収束するシリーズ

soma += 1/fat; 

変更して:あなたは、右ここで整数の除算を持って

#include <iostream> 
using namespace std; 
int main() 
{ 
    int n, i, j, fat; 
    float soma = 0.0; 
    cin >> n; 
    for (i = 1; i <= n; i++) 
    { 

     fat = 1; 
     soma += 1/fat; 
     for (j = 1; j <= n; j++) 
     { 
      fat *= j; 
     } 
    } 
    cout << soma << endl; 
    return 0; 
} 
+1

毎回factorialを計算しているので、毎回factorialを再計算する必要はありません。 –

+0

この記事を投稿する必要があります。http://www.joelonsoftware.com/articles/fog0000000319.html –

答えて

3

: 私はアウトラインを持っている

また
soma += 1./fat; 

あなたの実装はに非常に脆弱であることに注意してくださいnが大きくなると整数オーバーフローが発生します。

実用バージョンです。

int main() 
{ 
    int n, i, j, fat; 
    float soma = 1.0; // Change to 1.0 
    cin >> n; 
    for (i = 1; i <= n; i++) 
    { 

     fat = 1; 
     for (j = 1; j <= i; j++) 
     { 
      fat *= j; 
     } 
     soma += 1./fat;  // Move this to after the loop. 
    } 
    cout << soma << endl; 
    return 0; 
} 

コメントに記載されているとおり、各ステップで階乗を再計算する必要はありません。

+0

それは1つのエラーです、もう1つ、私はまだ見つけようとしています... – Mysticial

+0

そして、どのように大きなn、例、n = 1000を使用するのですか? –

+0

'n = 12'は整数オーバーフローを得る前に行くことができる大きさです。 – Mysticial

5

が実行されている用語を維持し、その結果にそれを追加します。

double result = 1.0; 
double term = 1.0; 

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

return result; 

あなたは小さな変更で任意のexp(x)を計算することができます。

関連する問題