Feedback

VB - Multiplikation von übergroßen Zahlen

Veröffentlicht von am 10/18/2006
(4 Bewertungen)
Mit dieser Funktion kann man sehr riesige Zahlen miteinander multiplizieren, dazu muss man die Zahlen als String angeben und als String bekommt man auch das Ergebnis zurück.
''' <summary>
''' Mit dieser Funktion kann man 2 Werte miteinander multiplizieren jedoch nach dem Prinzip
''' der schriftlichen Multiplikation. Man kann beliebig große Werte berechnen
''' </summary>
Public Function Multiply(ByVal A As String, ByVal B As String) As String
    Dim LineLen As Long
    Dim Run As Long
    Dim N1 As Short
    Dim N2 As Short
    Dim z As Short
    Dim i As Long
    Dim ZeroLen As Long
    Dim TmpLng As Long
    Dim TmpStr As String
    Dim AddTmp As Long
    Dim LineX As String
    Dim TmpResult As String = ""
    Dim Result As New System.Text.StringBuilder
    Dim LineArray() As String
    ReDim LineArray(B.Length)

    LineX = New String("0", B.Length - 1)

    For Run = 1 To B.Length
        For i = 1 To A.Length
            N1 = Integer.Parse(Mid(B, Run, 1))
            N2 = Integer.Parse(Mid(A, Len(A) - i + 1, 1))
            TmpLng = N1 * N2
            TmpLng = TmpLng + z

            If i <> A.Length Then
                If TmpLng > 9 Then
                    z = Integer.Parse(Mid(TmpLng.ToString, 1, 1))
                    LineX = Mid(TmpLng.ToString, 2) & LineX
                Else
                    LineX = Mid(TmpLng.ToString, 1) & LineX
                    z = 0
                End If
            Else
                LineX = TmpLng.ToString & LineX
            End If
        Next i
        LineArray(Run) = LineX
        If Run = B.Length Then Exit For
        LineX = New String("0", B.Length - Run - 1)
        z = 0
    Next Run

    'Leere stellen mit Nullen füllen
    ZeroLen = LineArray(1).Length
    For i = 2 To LineArray.Length - 1
        LineArray(i) = New String("0", ZeroLen - LineArray(i).Length) & LineArray(i)
    Next i

    'Alles addieren
    LineLen = Len(LineArray(1))
    AddTmp = 0
    z = 0

    For Run = 0 To LineArray(1).Length
        If Run = LineArray(1).Length Then Exit For
        AddTmp = 0

        'Es werden die Spalten der übereinanerliegenden Arrayeinträge addiert
        For i = 1 To LineArray.Length - 1
            AddTmp = AddTmp + Integer.Parse(Mid(LineArray(i), LineLen - Run, 1))
        Next i

        AddTmp = AddTmp + z
        z = 0

        'Falls wir in der letzten Runde sind aber AddTmp > als 9 ist würde ja normalerweise
        'der Algorithmus die Zahl nochmal aufteilen wollen um in der nächsten Runde
        'den Restwert zu übergeben. Da das aber dies die letzte Runde ist wird AddTmp
        'einfach so vorgeschrieben ohne weiterzumachen.
        If Run + 1 = LineArray(1).Length And AddTmp > 9 Then
            'TmpResult = AddTmp.ToString & TmpResult
            Result.Insert(0, AddTmp.ToString)
            Exit For
        End If

        'Falls die Zahl größer als 9 ist dann wird der Restwert in z abgelegt
        'und der Rest wird zu dem Result String hinzugefügt
        If AddTmp > 9 Then
            TmpStr = AddTmp.ToString
            AddTmp = Integer.Parse(Mid(TmpStr, TmpStr.Length))
            z = Integer.Parse(Mid(TmpStr, 1, TmpStr.Length - 1))
        End If

        Result.Insert(0, AddTmp.ToString)
    Next Run

    Return Result.ToString
End Function
Abgelegt unter Multiplikation, Mathe.

5 Kommentare zum Snippet

Günther Foidl schrieb am 9/25/2008:
Interessante Möglichkeit. Es gibt auch Möglichkeiten dies mit FFT zu bewerkstelligen. So wird meist in den numerischen Bibliotheken erledigt.
General Bison schrieb am 1/26/2009:
Bei mir stürzt es ab...

http://dotnet-forum.de/forums/p/1225/4484.aspx#4484

plz help....
Klemens Nanni schrieb am 3/30/2010:
Ich empfehle generell, immer den kleinstmöglichen Zahlentyp für Variablen zu verwenden. Besonders bei rechenaufwändigen Prozeduren kann es die Rechenzeit immens reduzieren.
helidrive schrieb am 2/17/2016:
Leider rechnet Deine Routine falsch:
Beispiel
2.781.543 x 54 = 150.203.322
und nicht 11.836.716 !!!!
helidrive schrieb am 2/17/2016:
Muß mich korrigieren, hatte einen Fehler bei der Formatumwandlung.
 

Logge dich ein, um hier zu kommentieren!