我正在为加泰罗尼亚语编写一个程序。所以这是公式:
我决定使用公式的中间部分,因为其他部分对于我的知识太过抽象(也许我在数学课上睡得太多)。
实际上我的程序适用于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;
}
}
}
如果有明显的错误,请提前感谢您的理解。我是编程新手。
答案 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