0

階乗を見つけるための次のコードがあります。

Private Shared Function Factorial(ByVal Number As Long) As Long
        If Number = 0 Then
            Return 1
        Else
            Return Number * Factorial(Number - 1)
        End If
End Function

通常、オーバーフローが発生します。4のような小さなものから始めた場合にのみ機能します。

30〜60などの開始番号で作業する必要があります。

何か案は?値の型をLONGに変更すると、この問題を防ぐことができると思いました。

参考までにVB.netです。

4

3 に答える 3

4

階乗は非常に大きくなり、非常に速くなります。aに収まる最大数 Longは約9×10^18です。Factorial(30)は約2.7×10^32です。

.Net 4を使用している場合は、BigInteger任意の数を保持するために使用できる組み込みクラスがあります。

.Net 4を使用していない場合は、intxなどのBigIntegerライブラリを見つけてダウンロードする必要があります。

于 2011-03-30T08:59:36.387 に答える
2

整数型とlong型でのみオーバーフロー例外が発生します。これを回避するには、System.DoubleまたはSystem.Numerics.BigInteger(またはBigDecimalだと思います)を使用できます。

たとえば、階乗の3つの異なるバージョンを実行する場合:1つはlong、1つはdouble、1つはbigintegerで、次のように5〜50x5の値の範囲で次のようになります。

    'Long Factorial   
    Public Function FactorialInt64(ByVal n As Integer) As Int64  
        If n = 1 Then  
            Return 1  
        Else  
            Return n * FactorialInt64(n - 1)  
        End If  
    End Function  
    ' Double Factorial   
    Public Function FactorialDouble(ByVal n As Integer) As Double  
        If n = 1 Then  
            Return 1  
        Else  
            Return n * FactorialDouble(n - 1)  
        End If  
    End Function  
    ' BigInteger Factorial   
    Public Function FactorialBigInteger(ByVal n As Integer) As BigInteger  
        If n = 1 Then  
            Return 1  
        Else  
            Return n * FactorialBigInteger(n - 1)  
        End If  
    End Function  

次のような結果が得られます。

階乗実行結果

完全なソースコードは、私のブログ投稿:VB.NETのFactorialとFibonacciにあります。

于 2012-04-05T07:58:10.780 に答える
1

問題を解決する.NET用の大きなintライブラリがあります。非常に多くの数を操作できます(システムメモリによってのみ制限されます)。

リンクは次のとおりです:http ://www.emilstefanov.net/Projects/GnuMpDotNet/

于 2011-03-30T09:13:23.087 に答える