-2
int n = Convert.ToInt32(Console.ReadLine());
int factorial = 1;
    
for (int i = 1; i <= n; i++)
{
    factorial *= i;    
}
Console.WriteLine(factorial);

このコードはコンソール アプリケーションで実行されますが、数値が 34 を超える場合、アプリケーションは 0 を返します。

0 が返されるのはなぜですか? 大きな数の階乗を計算するにはどうすればよいですか?

4

3 に答える 3

6

変数が格納できる範囲を超えています。これは事実上階乗であり、指数関数よりも速く成長します。int (最大値 2^31 = 2,147,483,647) の代わりにulong (最大値 2^64 = 18,446,744,073,709,551,615)を使用してみてくださいulong p = 1

さらに先に進む必要がある場合、.NET 4 以降にはBigInteger、任意の大きな数値を格納できる があります。

于 2012-11-04T19:49:36.463 に答える
3

ほとんどのプログラミング言語で整数オーバーフローが処理されるため、0 を取得しています。ループ内の各計算の結果を (HEX 表現を使用して) 出力するとどうなるかを簡単に確認できます。

int n = Convert.ToInt32(Console.ReadLine());
int factorial = 1;
for (int i = 1; i <= n; i++)
{
  factorial *= i;
  Console.WriteLine("{0:x}", factorial);
}
Console.WriteLine(factorial);

n = 34 の場合、結果は次のようになります。

1 2 6 18 78 2d0 13b0 ... 2c000000 80000000 80000000 0

基本的に 2 で乗算すると数値が左にシフトし、十分な 2 を含む numberer を乗算すると、すべての有効桁数が 32 ビット幅の整数から外れます (つまり、最初の 6 つの数値で 4 つの 2 が得られます: 1、2、3、2*2、5、 2*3 であるため、それらを乗算した結果は 0x2d0 で、最後に 4 つのゼロ ビットがあります)。

于 2012-11-04T20:23:06.197 に答える
1

.net 4.0 を使用していて、1000 の階乗を計算したい場合はBigInteger、Int32 または Int64 または UInt64 の代わりに使用してみてください。あなたの問題声明「うまくいかない」は、私が良い服従を与えるのに十分ではありません. コードは次のようになります。

using System;
using System.Numerics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            int factorial = Convert.ToInt32(Console.ReadLine());

            var result = CalculateFactorial(factorial);

            Console.WriteLine(result);
            Console.ReadLine();
        }

        private static BigInteger CalculateFactorial(int value)
        {
            BigInteger result = new BigInteger(1);
            for (int i = 1; i <= value; i++)
            {
                result *= i;
            }
            return result;
        }
    }
}
于 2012-11-04T19:57:00.617 に答える