【C++入門】計算を確定するまで桁あふれしない階乗計算

以前の記事では、JAVAでパスカルの三角形を描くプログラムを作った。

【数学】第一回 二項定理とパスカルの三角形

実はこのプログラムには問題があった。

タイトルから察しがつくように、階乗の計算で桁あふれを起こしてしまうために、あまり大きな三角形が描けないのだ。

階乗の計算ロジックは単純に考えれば下記のようになる。


//Nは自然数
public long factorial(int N) {
long answer = 1;
for(int i = 2; i <= N; i++ ) { answer *= i; } return answer; } [/cpp] しかし、これだと戻り値をロングにしても、20!もやれば桁あふれを起こす。 けれども、100!を99!で割った値なら、大きな数字にはならない。というか100だ。 途中の式では膨大な数値を扱っているかもしれないけれど、最終的にはそれほど大きな数字にならない計算だってあるわけだ。 とりあえず、階乗の式のまま、できるところまで計算して、最後に数値に変換する、ということができれば、もうちょっとはましな階乗のロジックといえるかもしれない。 というわけで、今日学んだクラスの概念をつかって、階乗のクラスを作ってみた。 さらに、オペランドのオーバーライドも使用すれば、普通の数値のように掛けたり、割ったりもできる。 [cpp num=1] #include "Factorial.h" //階乗クラス #include
using namespace std;

void case0601() {
//100の階乗
Factorial factA = Factorial(100);

//98の階乗
Factorial factB = Factorial(98);

//階乗同士の割り算
factA = factA / factB;

//途中式
factA.Dump();

//計算結果
cout << " = " << (size_t)factA.toFraction().toDouble() << endl; } void main() { case0601(); } [/cpp] 実行結果

99 * 100 = 9900
続行するには何かキーを押してください . . .

これなら、もう少し大きいパスカルの三角形が描けそうだ。

5年前

コメントを残す

メールアドレスが公開されることはありません。