0

1000桁以上の非常に大きな数を保持するためのデータ型? 100000000 などの大きな数の階乗を見つける必要があります。私の階乗プログラムは、より小さな数に対してうまく機能します。

long factorial(int x)
{
    long fact=1;
    if(x<0)
            {
        System.out.println("Incorrect input, enter a positive number");
        fact=0;
    }
    if(x==0)
        fact=1;
    if(x>0)
            {
            fact=x;
        fact=fact*factorial(x-1);

    }
    return fact;
}
4

3 に答える 3

7

が必要ですBigInteger。任意の大きな数を保持できます。

しかし、あなたの場合100000000!は非常に膨大な数であるため、何も役に立ちません。

于 2013-06-30T19:47:40.550 に答える
5

ガンマ関数の対数を使用する必要があります。単純な学生のやり方gamma(n) = (n-1)! よりもはるかに効率的です。その場合は double になり、自然対数は値よりもゆっくりと増加します。

再帰? お願いします。問題は、返す値のサイズではありません。スタック フレームが多すぎて、そのずっと前にメモリ不足エラーが発生します。

于 2013-06-30T19:50:50.910 に答える
1

は理論的にはそのBigIntegerような値を処理しますが、実際には計算できません。

まず、アルゴリズムは再帰を使用するため、 の 100.000.000 回の再帰呼び出しが必要になりますfactorial。結果を計算するずっと前に、スタック オーバーフローが発生します。再帰を避けるためにアルゴリズムを変更する必要があります (たとえば、ループを使用します)。

第二に、結果は巨大になります。次のような階乗を近似する式を使用する

log n! ~~ n log(n/e)

お客様の番号は 750.000.000 桁を超えると判断できます。運が良ければ、記憶に収めることができるかもしれませんが、合理的な時間内に数値を計算することはできません。想像してみてください。数億桁の数字で 100.000.000 回の乗算を実行する必要があります。

于 2013-07-01T11:41:49.127 に答える