0

プログラムはコマンドライン引数 N を読み取り、N! = 1 * 2 * ... * N標準出力に出力します。

public class Factorial {

    // return n!
    // precondition: n >= 0 and n <= 20
    public static long factorial(long n) {
        if (n <  0) throw new RuntimeException("Underflow error in factorial");
        else if (n > 20) throw new RuntimeException("Overflow error in factorial");
        else if (n == 0) return 1;
        else return n * factorial(n-1);
    }

    public static void main(String[] args) {
        long N = Long.parseLong(args[0]);
        System.out.println(factorial(N));
    }

}

入力 (N) と出力 (階乗 (N)) の例:

5 >>> 120
12 >>> 479001600
20 >>> 2432902008176640000
21 >>> java.lang.RuntimeException: Overflow error in factorial

備考:
- N > 20 の場合、long はオーバーフローし
ます - より大きな階乗を処理するには、拡張精度演算を使用する必要があります

それで、私の質問は、このコードでより大きな階乗を処理するために拡張精度演算を使用する方法ですか?? 変数longよりも大きな値を保持できるJavaの変数タイプは他にありますか?

4

1 に答える 1

1

BigInteger非常に大きな整数とBigDecimal小数をそれぞれ正確に格納するために使用できます。それらが再帰で使用されているのをよく見かけます。

BigDecimalまたはBigIntgerと aの組み合わせを使用しMapて、コンピューターの速度を低下させることなく、フィボナッチ数列のような非常に大きなものを格納して効率的に計算できます。

たぶん、BigInteger と BigDecimalを読む必要があります。ここに来る前に、まず少し調べてみることをお勧めします。

于 2013-09-22T16:00:30.650 に答える