C# 将两个Ulong整数相除会输出错误的结果

C# 将两个Ulong整数相除会输出错误的结果,c#,math,factorial,catalan,C#,Math,Factorial,Catalan,我正在为加泰罗尼亚数字写一个程序。下面是公式: 我决定使用公式的中间部分,因为其他部分对我的知识来说太抽象了,也许我在数学课上睡得太多了。 实际上,我的程序在n=0时运行良好;,n=5;,n=10;但如果我输入n=15;-动臂来了-输出为2,此时应为9694845。 这就是我的孩子: using System; namespace _8_Numbers_of_Catalan { class CatalanNumbers { static void Main()

我正在为加泰罗尼亚数字写一个程序。下面是公式:

我决定使用公式的中间部分,因为其他部分对我的知识来说太抽象了,也许我在数学课上睡得太多了。 实际上,我的程序在n=0时运行良好;,n=5;,n=10;但如果我输入n=15;-动臂来了-输出为2,此时应为9694845。 这就是我的孩子:

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

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

你应该使用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

为此,应使用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

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

你打到factorial15*2的电话是30!这将导致的值为

265,252,859,812,191,058,636,308,480,000,000
比64位整数变量更适合:

18,446,744,073,709,551,615 (0xFFFFFFFFFFFFFFFF).
您可以选择使用slow或double类型,最大值为1.7976931348623157E+308。这意味着你会失去一些精确性,这可能是相关的,也可能不是相关的

另一种选择是使用一种算法来近似大阶乘的值,使用一种渐近近似,如Mathematica使用的

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


作为最后一个但并非最不重要的选项,我还没有彻底检查,我认为可能存在允许您计算或近似到足够精度和精度a的特定算法。

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

你打到factorial15*2的电话是30!这将导致的值为

265,252,859,812,191,058,636,308,480,000,000
比64位整数变量更适合:

18,446,744,073,709,551,615 (0xFFFFFFFFFFFFFFFF).
您可以选择使用slow或double类型,最大值为1.7976931348623157E+308。这意味着你会失去一些精确性,这可能是相关的,也可能不是相关的

另一种选择是使用一种算法来近似大阶乘的值,使用一种渐近近似,如Mathematica使用的

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


作为最后一个但并非最不重要的选项,我还没有彻底检查,我认为可能存在特定的算法,允许您计算或近似到足够的精度和精度a。

使用第三个公式,避免第二个公式出现溢出。在维基百科上查一下,圆周率就像西格玛,但只是乘法。将1:1转换为代码。这是阶乘的一个简单实现。这将是不准确和低效的。最好使用lngamma函数和记忆。我想知道是否存在递归关系Cn和Cn-1,使用第三个公式可以避免第二个公式发生的溢出。在维基百科上查一下,圆周率就像西格玛,但只是乘法。将1:1转换为代码。这是阶乘的一个简单实现。这将是不准确和低效的。最好使用lngamma函数和记忆。我想知道是否存在递归关系Cn和Cn-1如果下一个投票者能够评论他/她认为这个答案有什么错,那就好了,这样我就有机会相应地改进它。如果下一个投票者能够评论他/她认为这个答案有什么错,那就好了,这样我就有机会对它进行相应的改进。