1

我正在为加泰罗尼亚数字编写程序。所以这是一个公式:


这是公式


我决定使用公式的中间部分,因为其他部分对于我的知识来说太抽象了(也许我在数学课上睡得太多了)。实际上,我的程序可以正常工作n = 0;,但是如果我输入- 这里是繁荣 - 输出应该是。所以这是我的孩子:n = 5;n = 10;n = 15;29694845

using System;
namespace _8_Numbers_of_Catalan
{
    class CatalanNumbers
    {
        static void Main()
        {
            Console.Write("n: ");
            int n = int.Parse(Console.ReadLine());
            Console.WriteLine("Catalan({0})", n);
            //calculating the Catan number from the formula 
            // Catan(n) = [(2*n)!]/[(n+1)! * n!]
            Console.WriteLine((factorial(2 * n)) / (factorial(n + 1) * factorial(n)));
        }//finding the factorial
        private static ulong factorial(int n)
        {
            ulong fact = 1;
            for (int i = 1; i <= n; i++)
            {
                fact *= (ulong)i;
            }
            return fact;
        }
    }
}

如果有明显错误,请提前感谢您理解我。我是编程新手。

4

2 回答 2

4

那是因为您正在使用最多可以包含 64 位的整数变量来执行这些计算。

你的电话factorial(15 * 2)30!这将导致价值

265,252,859,812,191,058,636,308,480,000,000

远不止适合 64 位整数变量:

18,446,744,073,709,551,615 (0xFFFFFFFFFFFFFFFF).

您拥有的选项是使用System.Numerics.BigInteger类型(慢)或 a double(最大为1.7976931348623157E+308)。这意味着您将失去一些可能相关或不相关的精确度。

另一个选择是使用一种算法来近似大阶乘的值,该算法使用渐近近似,例如Mathematica 使用的Schönhage–Strassen 算法。

您可能还想查看一些现有的在线资源,以计算 .NET 中的大阶乘

作为最后但并非最不重要的选择(我还没有彻底检查),在我看来,存在允许您计算(或接近足够准确度和精度)a 的特定算法Catalan number

于 2015-04-21T11:18:51.900 回答
3

您应该为此使用 System.Numerics.BigInteger。(在您的项目中添加 System.Numerics 作为参考)。

private static BigInteger factorial(int n)
{
     BigInteger fact = 1;
     for (int i = 1; i <= n; i++)
     {
        fact *= i;
     }
     return fact;
 }

 // output: 9694845
于 2015-04-21T11:17:56.300 回答