簡體   English   中英

將兩個Ulong整數相除會輸出錯誤的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM