划分两个Ulong整数输出错误的结果

时间:2015-04-21 11:13:19

标签: c# math factorial catalan

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


This is the formula


我决定使用公式的中间部分,因为其他部分对于我的知识太过抽象(也许我在数学课上睡得太多)。 实际上我的程序适用于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;
        }
    }
}

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

2 个答案:

答案 0 :(得分: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类型(慢)或double(最大值1.7976931348623157E+308)。这意味着你将失去一些精确性,可能相关或不相关。

另一种选择是使用算法来使用渐近逼近(例如Mathematica使用的Schönhage–Strassen algorithm)来逼近大因子的值。

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

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

答案 1 :(得分: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