0

この反復階乗方程式では、39を超える数を通過すると負になります。どうしてこれなの

    public static void main(String[] args)
    {
        long var = formula(40);
        if(var != 0){
        System.out.print(var);
        }
        else{return;}
    }
    public static long formula(final int n) {
        if (n < 0) {
            System.err.println("No negative numbers");
            return 0;
        }
        long ans = 1;
        for (int i = 1; i <= n; i++) {
            ans *= i;
        }


        return ans;
        }
}
4

1 に答える 1

1

オーバーフローと呼ばれるものが原因です。特定のタイプが保持できる値には制限があります。整数型の値の制限を超えると、整数のオーバーフローが発生します。これは、整数のオーバーフローに関するリンクと、いくつかの詳細です。

要点は、階乗は急速に成長する指数関数であるため、長整数に収まらない値になってしまうのにそれほど時間はかからないということです。負の数が表示されている場合は、この制限を超えているためです。制限はプラットフォームによって異なりますが、unsignedlongintの場合は多くの場合約4,294,967,295です。

上記の制限を使用すると、12!までの階乗しか計算できず、13以上はオーバーフローします。

于 2013-03-04T15:27:46.367 に答える