0

この小さなプログラムは、階乗を計算する 2 つのアプローチ (反復による方法と再帰による方法) をテストします。

Factorial.cs:

using System;

namespace Functions
{
    public class Factorial
    {
        public static ulong CalcRecursively(int number)
        {
            if (number > 1)
                return (ulong)number * CalcRecursively(number - 1);
            if (number <= 1)
                return 1;

            return 0;
        }

        public static ulong Calc(int number)
        {
            ulong rValue=1;

            for (int i = 0; i < number; i++)
            {
                rValue = rValue * (ulong)(number - i);                
            }

            return rValue;

        }


    }
}

MainProgram.cs:

using System;

using Functions;
class FunctionClient
{


    public static void Main()
    {

        Console.WriteLine("{0}\n", Functions.Factorial.CalcRecursively(TESTED_VALUE));
        Console.WriteLine("{0}\n", Functions.Factorial.Calc(TESTED_VALUE));

        Console.ReadKey();

    }

    const int TESTED_VALUE = 60;

}

コンソール:

9727775195120271360
9727775195120271360

インターネットで最も信頼できる情報源によると、数字が小さい場合は問題ありませんが、そうでない場合 (例: 60 の場合) は正しくない値が出力されます。私の間違いを指摘していただけますか?まったく異なる 2 つの方法が、まったく同じように機能しないとは信じられません。

4

2 に答える 2

7

C# の ulong データ型の限界に達しています。MSDNによると、これは 18,446,744,073,709,551,615 の最大値に制限する 64 ビットのデータ構造です。

より大きな数を調べたい場合は、.NET 4 で導入されたBigInteger 構造に興味があるかもしれません。

于 2012-07-25T19:57:43.270 に答える
2
using System.Numerics;

public static BigInteger Calc(int number)
{
    BigInteger rValue = 1;
    for (int i = 0; i < number; i++)
    {
        rValue = rValue * (ulong)(number - i);
    }
    return rValue;
}

System.Numerics への参照を追加します。

于 2012-07-25T20:05:53.530 に答える