如何以A * 10- ^ n的形式表示数字?

时间:2014-03-23 17:18:01

标签: vb.net

我最近在Visul Basic 13中编写了这个程序。 它搜索第n个加泰罗尼亚语数字但是在48之后甚至十进制类型太短。 有没有其他方式来代表他们?比如A * 10 ^ n?

的形式
Public Class Try_Catalan_Number

    'Catalan numbers form a sequence of natural numbers that occur in various counting problems,
    'often involving recursively defined objects.

    Inherits Base_Number

    Public Overrides Sub Test()

        Dim Return_Catalan_Value As Decimal

        If Function_Catalan(Return_Catalan_Value) = False Then

            Return_To_Form_Boolean = False
        Else

            Return_To_Form_Boolean = True

        End If

        Return_To_Form_Value = Function_Catalan(Return_Catalan_Value)

    End Sub

    Private Function Function_Catalan(Return_Catalan_Value As Decimal) As Decimal

        'We return a Decimal function because catalan numbers can be very big and decimal is the biggest type.

        Dim Binomial_Cofficients As Decimal
        Dim Result As Decimal
        Dim Number_Of_Loops As Integer
        Dim tmpNumber As Object
        Dim K As Decimal
        Dim N As Decimal

        If (Number > 48) Then

            Return False
            Exit Function

        End If

        '48 is the largest catalan number position which can be displayed...any position above 48 is too big.

        tmpNumber = Number - 1
        N = 2 * tmpNumber
        K = tmpNumber

        Result = 1

        For Number_Of_Loops = 1 To K

            Result = Result * (N - (K - Number_Of_Loops))
            Result = Result / Number_Of_Loops

        Next Number_Of_Loops

        Binomial_Cofficients = Result
        tmpNumber = Number - 1
        tmpNumber = ((1 / (1 + tmpNumber)) * Binomial_Cofficients)
        Return_Catalan_Value = tmpNumber

        Return Return_Catalan_Value

    End Function

End Class

2 个答案:

答案 0 :(得分:2)

[我假设" Visul Basic 13"你的意思是与Visual Studio 2013相关的VB,即VB版本12.0。]

您可以使用System.Numerics.BigInteger(您必须添加对System.Numerics的引用):

Imports System.Numerics

Module Module1

    Friend Function Factorial(n As Integer) As BigInteger
        If n < 2 Then Return 1
        If n = 2 Then Return 2
        Dim f As BigInteger = BigInteger.Parse("2")
        For i = 3 To n
            f *= i
        Next
        Return f
    End Function

    Friend Function CatalanNumber(n As Integer) As BigInteger
        Return Factorial(2 * n) / (Factorial(n + 1) * Factorial(n))
    End Function

    Sub Main()
        For i = 0 To 550
            Console.WriteLine(CatalanNumber(i).ToString())
        Next

        Console.ReadLine()

    End Sub

End Module

我没有测试它可以计算的最大加泰罗尼亚数字,而且我没有兴趣验证结果超出Wikipedia page所示的结果。

优化是留给读者的练习;)

编辑:FWIW,我可以通过

让它运行得更快一点
Function CatalanNumber(n As Integer) As BigInteger
    Dim nFactorial = Factorial(n)
    Dim twonFactorial = nFactorial
    For i = (n + 1) To 2 * n
        twonFactorial = BigInteger.Multiply(twonFactorial, i)
    Next
    Return twonFactorial / (BigInteger.Pow(nFactorial, 2) * (n + 1))
End Function

速度增加从大约50%( n = 50)到20%( n = 5000)不等。如果你只为相当小的 n 使用该功能几次,那么可能没什么值得担心的。

Edit2 重新编写您的函数,以便更容易阅读并删除一个错误,我们得到:

Private Function Function_Catalan(a As Integer) As BigInteger

    If a = 0 Then Return 1

    Dim binomialCofficient As BigInteger = BigInteger.One
    Dim n As Integer = 2 * a
    Dim k As Integer = a - 1

    For i As Integer = 1 To k
        binomialCofficient = binomialCofficient * (n - (k - i)) / i
    Next i

    Return binomialCofficient / a

End Function

答案 1 :(得分:1)

获取此格式,您可以使用:

String.Format("{0:E4}", InputNumber)