Feedback

Multiplikation von übergroßen Zahlen

Sprache: VB

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
''' <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

5 Kommentare

  1. Ich empfehle generell, immer den kleinstmöglichen Zahlentyp für Variablen zu verwenden. Besonders bei rechenaufwändigen Prozeduren kann es die Rechenzeit immens reduzieren.