3

このコードを使用してカタロニア語数を計算しています。n=6 までは正しい値が返され、その後は間違った値が返されます。電卓を使って手動でチェックしました。例: n=5 カタロニア語番号が 42 の場合は正しいですが、 n=7 の場合、答えは 429 であるため、完全に間違っている 6 になります。何が間違っているのかわかりません。誰か助けてくれませんか?

static void Main(string[] args)
{
    int i, n, fact, fact1, fact2, CatalanN;
    Console.WriteLine("Enter a Number (n>=0)");

    n = Convert.ToInt32(Console.ReadLine());
    fact = n;

    for (i = n - 1; i > 0; i--)
    {
        fact = fact * i;
    }
    Console.WriteLine("" + fact);
    Console.ReadLine();

    fact1 = 2*n;

    for (i = 2*n - 1; i > 0; i--)
    {
        fact1 = fact1 * i;
    }
    Console.WriteLine("" + fact1);
    Console.ReadLine();

    fact2 = n+1;

    for (i = (n+1)-1; i > 0; i--)
    {
        fact2 = fact2 * i;
    }
    Console.WriteLine("" + fact2);
    Console.ReadLine();

    CatalanN = fact1 / (fact2 * fact);
    Console.WriteLine("Catalan Number of the given number is : " + CatalanN);
    Console.ReadLine();
}
4

2 に答える 2

6

2 番目のループを次のように変更した場合:

for (i = 2*n - 1; i > 0; i--)
{
    int old = fact1;
    fact1 = fact1 * i;
    Console.WriteLine("" + old + " " + fact1);
}

次に、オーバーフローに苦しんでいることがわかります(値を並べるためにわずかに再フォーマットされています):

        14        182
       182       2184
      2184      24024
     24024     240240
    240240    2162160
   2162160   17297280
  17297280  121080960
 121080960  726485760
 726485760 -662538496 <- overflow occurs here.
-662538496 1644813312
1644813312  639472640
 639472640 1278945280
1278945280 1278945280

これは、計算における階乗型の項によるものです。タイプを に変更するlongと、より多くの呼吸スペースが得られます (C 10を実行できるようになります)。それを超えて、decimalもう少し先に進むことができますがSystem.Numerics.BigInteger、より高い数値には任意精度の数学ライブラリ ( など) を使用する必要がある場合があります。

暫定項を少し最小限に抑える、わずかに負担の少ない計算を使用することをお勧めします。

n = Convert.ToInt32(Console.ReadLine());
CatalanN = 1;
Term = 0;
while (n-- > 1) {
    Term++;
    CatalanN = CatalanN * (4 * Term + 2) / (Term + 2);
}

これにより、使用するデータ型に関係なく、より多くの呼吸スペースが得られます。私たちの卑劣な人でさえ、その計算でintC 16longに達することができ、aは少なくとも C 25に達することができます。

于 2015-07-20T07:47:24.347 に答える