4

Java のintの範囲は -2^31 から 2^31-1 でなければならないことを理解しています。

しかし、このコード スニペットを 20 で実行すると、次のようになります。

public class Factorial {
    public int factorial(int n) {
        int fac=1;
        for (int i=1; i<=n; i++) {
            fac *= i;
            System.out.println("Factorial of " + i + " is: " + fac);
        }
        return fac;
    }
}

出力:

Factorial of 1 is: 1
Factorial of 2 is: 2
Factorial of 3 is: 6
Factorial of 4 is: 24
Factorial of 5 is: 120
Factorial of 6 is: 720
Factorial of 7 is: 5040
Factorial of 8 is: 40320
Factorial of 9 is: 362880
Factorial of 10 is: 3628800
Factorial of 11 is: 39916800
Factorial of 12 is: 479001600
Factorial of 13 is: 1932053504
Factorial of 14 is: 1278945280
Factorial of 15 is: 2004310016
Factorial of 16 is: 2004189184
Factorial of 17 is: -288522240
Factorial of 18 is: -898433024
Factorial of 19 is: 109641728
Factorial of 20 is: -2102132736

13 (13! = 6,227,020,800) からでは意味がありません。範囲外で巻き付いているようです。どうしたの?私が使用しているEclipseが原因ですか?

関係ないと思いますが、テストコードは次のとおりです。

public class TestFac {

    public static void main(String[] args) {
        int n;
        Scanner sc = new Scanner(System.in);

        System.out.println("Input num you want to factorial: ");
        n = sc.nextInt();
        Factorial fac = new Factorial();
        fac.factorial(n);
    }
}
4

5 に答える 5

22

ここで、整数クロックの概念について言及したいと思います。

Java での int の最大値と最小値は次のとおりです。

int MAX_VALUE = 2147483647
int MIN_VALUE = -2147483648

以下の結果を確認してください

 int a = 2147483645;
 for(int i=0; i<10; i++) {
    System.out.println("a:" + a++);
 }

出力:

a:2147483645
a:2147483646
a:2147483647
a:-2147483648
a:-2147483647
a:-2147483646
a:-2147483645
a:-2147483644
a:-2147483643
a:-2147483642

これは、整数の +ve 範囲の限界を超えると、次の値が再び負の開始値から始まることを示しています。

 -2147483648,       <-----------------
 -2147483647,                        |
 -2147483646,                        |
  .                                  |
  .                                  |
  .                                  |    (the next value will go back in -ve range)
  0,                                 |
 +1,                                 |
 +2,                                 |
 +3,                                 |
  .                                  |
  .                                  |
  .,                                 |
 +2147483645,                        |
 +2147483646,                        |
 +2147483647     ---------------------

13 の階乗を計算すると、6227020800 です。この値は、j​​ava の int の範囲を超えています。したがって、新しい値は

        6227020800
      - 2147483647 (+ve max value)
   -----------------
Value = 4079537153
      - 2147483648 (-ve max value)
   -----------------
value = 1932053505
   -             1  (for zero in between -ve to +ve value)
  ----------------
Answer = 1932053504

したがって、あなたの答えでは、13 の階乗は 1932053504 になります。これが整数時計のしくみです。

目的を達成するために、整数の代わりに long データ型を使用できます。

于 2013-09-30T07:40:54.360 に答える
3

プリミティブ データ型から:

intデータ型は、32 ビットの符号付き 2 の補数整数です。最小値は -2,147,483,648 で、最大値は 2,147,483,647 (包括的) です。整数値の場合、他のものを選択する理由 (上記のような) がない限り、通常、このデータ型がデフォルトの選択です。ほとんどの場合、このデータ型はプログラムで使用する数値に対して十分な大きさですが、より広い範囲の値が必要な場合は、代わりに long を使用してください。

この話の教訓: 先生を盲目的に信じてはいけません!

于 2012-12-24T10:36:14.967 に答える
2

Java Integer にチェックを入れると、その最大値と最小値は次のようになります。

int    MAX_VALUE = 2147483647
int    MIN_VALUE = -2147483648

いくつかの計算を行うと、(factorial of 13)1932053504 * 1427048749056int MAX_VALUEを超えていることがわかります。そのため、階乗の 14 に対して間違った結果が得られます。したがって、良い結果を得るには、long型を使用することをお勧めします。代わりは。

于 2012-12-24T10:36:44.097 に答える
1

階乗 13 は 6227020800 です。これは 31 ビットを超えるため、ラップ アラウンドされます。

大きな数 (任意の長さなど)をサポートしたい場合は、無制限の範囲を提供するBigIntegerクラスの使用を検討してください。

于 2012-12-24T10:36:57.467 に答える