[英]Dividing two Ulong integers outputs wrong result
我正在為加泰羅尼亞語數字編寫程序。 所以這是公式:
我決定使用公式的中間部分,因為其他部分對我的知識來說太抽象了(也許我在數學課上睡得太多了)。 實際上,我的程序在n = 0;
工作正常n = 0;
, n = 5;
, n = 10;
但是如果我輸入n = 15;
-動臂來了-當應該為9694845
時,輸出為2
。 所以這是我的孩子:
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;
}
}
}
預先感謝您理解我是否有明顯的錯誤。 我是編程新手。
這是因為您正在使用最多包含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
(最大值為1.7976931348623157E+308
)。 這意味着您可能會失去一些可能不相關的精度。
您還有另一種選擇,就是使用漸近逼近算法(例如,Mathematica使用的Schönhage–Strassen算法)來估算大階乘的值。
您可能還想查看一些現有的在線資源,以計算.NET中的大階乘。
作為最后但並非最不重要的選擇(並且我還沒有徹底檢查過),在我看來,存在特定的算法可以使您計算(或近似於足夠的精度和精度) Catalan number
。
您應該為此使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.