C# 计算加泰罗尼亚数

C# 计算加泰罗尼亚数,c#,catalan,C#,Catalan,我用这个代码来计算加泰罗尼亚数字。它给了我正确的值,直到n=6,然后它给了我错误的值。我用计算器手动检查。例如:当n=5时,加泰罗尼亚数字是42,这是正确的,但当n=7时,它给我6,这是完全错误的,因为答案应该是429。我就是想不出是怎么回事。有人能帮我吗 static void Main(string[] args) { int i, n, fact, fact1, fact2, CatalanN; Console.WriteLine("Enter a Number (n>

我用这个代码来计算加泰罗尼亚数字。它给了我正确的值,直到n=6,然后它给了我错误的值。我用计算器手动检查。例如:当n=5时,加泰罗尼亚数字是42,这是正确的,但当n=7时,它给我6,这是完全错误的,因为答案应该是429。我就是想不出是怎么回事。有人能帮我吗

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();
}

如果将第二个循环更改为:

for (i = 2*n - 1; i > 0; i--)
{
    int old = fact1;
    fact1 = fact1 * i;
    Console.WriteLine("" + old + " " + fact1);
}
然后您将看到您正遭受溢出(稍微重新格式化以排列值):


无论您使用哪种数据类型,这将提供更多的喘息空间。即使我们的
int
值很低,也可以计算到C16,而
long
至少可以计算到C25,这是我可以费心检查的。

为阶乘等编写一些辅助方法可能是一个很好的练习。非常感谢大家。所以使用
long
而不是
int
。它在某一点上仍然会溢出,但是对于更大的数字。@MatthewWatson您可以用于任意大的ITNEGER,但是对于可以被
long
覆盖的情况,性能将受到影响。我已经尝试了“decimal”和“long”。我现在使用“double”,它工作到n=85,然后它给出无穷大。非常感谢你的帮助。
        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
n = Convert.ToInt32(Console.ReadLine());
CatalanN = 1;
Term = 0;
while (n-- > 1) {
    Term++;
    CatalanN = CatalanN * (4 * Term + 2) / (Term + 2);
}