4
for (int i = 0; i <= 25; i++)
    System.out.printf("%d! = %,d\n", i, factorial(i));

上記のコードは、以下の階乗メソッドを初期化します。

public static long factorial(int num1)
{
    if (num1 == 0)
        return 1;
    else
        return Math.abs(num1 * factorial(num1 - 1));
}

そのため、次の出力が作成されます。

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5,040
8! = 40,320
9! = 362,880
10! = 3,628,800
11! = 39,916,800
12! = 479,001,600
13! = 6,227,020,800
14! = 87,178,291,200
15! = 1,307,674,368,000
16! = 20,922,789,888,000
17! = 355,687,428,096,000
18! = 6,402,373,705,728,000
19! = 121,645,100,408,832,000
20! = 2,432,902,008,176,640,000
21! = 4,249,290,049,419,214,848
22! = 1,250,660,718,674,968,576
23! = 8,128,291,617,894,825,984
24! = 7,835,185,981,329,244,160
25! = 7,034,535,277,573,963,776

21の結果!間違っており(51,090,942,171,709,440,000になるはずです)、結果は22で完全にヘイワイヤーになります!以上。誰かが理由を説明できますか?

4

5 に答える 5

7

21番目以降の値では、真の値が。に対して大きすぎるため、値が不安定になりますlong。より大きな数が必要な場合は、を使用してBigIntegerください。

于 2012-11-08T04:30:09.370 に答える
2

がJavaで取ることができる最大値は、long9,223,372,036,854,775,807であり、。の後にオーバーフローし20!ます。

階乗の計算にはBigIntegerを使用する必要があります。

例えば:

    BigInteger n = BigInteger.ONE;
    for (int i=1; i<=20; i++) {
        n = n.multiply(BigInteger.valueOf(i));
        System.out.println(i + "! = " + n);
    }
于 2012-11-08T04:44:56.497 に答える
2

長い間、 -9,223,372,036,854,775,808から+9,223,372,036,854,775,807ソース)の間で表すことができる ので、階乗がその範囲を通過するとすぐにエラーが発生し始めます。

于 2012-11-08T05:01:14.117 に答える
0

longそれはすべて容量までは大丈夫のようです。そして、なぜMath.abs()を使用しているのですか?

于 2012-11-08T04:33:00.413 に答える
0

明らかに不安定ではありません。ここを参照してください。あなたは20まではかなり上手です。その後、私はlong(9223372036854775807)の最大値を調べ始めます。

于 2012-11-08T04:37:49.060 に答える