2016-10-04 15 views
0

C++で数値の階乗を求めるコードを書いた。C++:coutを使ってlong long intを正しく出力する方法

ここにコードがあります。

#include <iostream> 

using namespace std; 

unsigned long long getFactorial(int); 

int main(int argc, char **argv) { 
     int num = 5; 
     unsigned long long factorial = getFactorial(a); 

     cout << "Factorial of " << num << ": " << factorial << endl; 

     return 0; 
} 

unsigned long long getFactorial(int num) { 
     int i; 
     unsigned long long factorial = 1; 
     for(i=1; i<=num; i++) { 
       factorial *= i; 
     } 

     return factorial; 
} 

私はnum値に5を代入

は、それが適切に正しい値を出力し、120しかし、私はもっと大きな数字を割り当てるとき、例えば100、それは単に0は私がコードを変更することができますどのように出力します結果をコンソールに正しく印刷しますか?

+0

uint64_t(8バイト)は約93を保持できます! 100!単純に大きすぎます。 92より小さいと試してみてください!おそらく、符号なしlong long、intまたは符号なし数値だけを使用してください。 –

+0

より大きい階乗については、gmp(拡張精度演算)を調べてください。それは1000を扱うことができます!、結果として大きな文字列を生成します。 –

+0

あなたは結論92にどうやって到着しましたか? 64ビット整数に収まるか?それはできません。 20!限界です。 – paddy

答えて

0

私は自分で答えを見つけました。

ライブラリgmpを使用することで、大きな整数を処理するのがはるかに簡単になりました。

ここに修正コードがあります。 gmpライブラリを使用するために

#include <iostream> 
#include <gmpxx.h> 

using namespace std; 

mpz_class getFactorial(int); 

int main(int argc, char **argv) { 
     int num = 100; 
     mpz_class factorial = getFactorial(num); 

     cout << "Factorial of " << num << ": " << factorial << endl; 

     return 0; 
} 

mpz_class getFactorial(int num) { 
     int i; 
     mpz_class factorial = 1; 
     for(i=1; i<=num; i++) { 
       factorial *= i; 
     } 

     return factorial; 
} 

、Iは、<gmpxx.h>ヘッダファイルが含まれていました。次に、factorial変数のデータ型とgetFactorial()関数の戻り値の型をunsigned long longからmpz_classに変更しました。これは大きな整数を表すデータ型です。

コードを変更した後、次のフラグを使用してGCCでコンパイルしました。

$gcc test.cpp -lstdc++ -lgmpxx -lgmp -o test

-lgmpxx-lgmpフラグがgmpライブラリを使用してコードをコンパイルする必要があります。

これで正常に動作します。

+0

良いこと...あなた自身で解決策を見つけたら、ずっと学ぶことができます! –

関連する問題