Feedback

VB - Multiplikation von übergroßen Zahlen

Veröffentlicht von am 18.10.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.
GFU-Schulungen  [Anzeige]

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

JavaScript für .NET-Entwickler

Sie sind .NET-Entwickler und nun stehen Sie vor der Aufgabe, JavaScript in Ihre Arbeit einzubinden. Die Schulung vermittelt Ihnen die JavaScript Grundlagen und die Funktionen der Scriptsprache. Sie wissen, wie objektorientierte Programmierung in JavaScript funktioniert und lernen abschließend Best Practicies Fälle kennen.

''' <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 25.09.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 26.01.2009:
Bei mir stürzt es ab...

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

plz help....
Klemens Nanni schrieb am 30.03.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 17.02.2016:
Leider rechnet Deine Routine falsch:
Beispiel
2.781.543 x 54 = 150.203.322
und nicht 11.836.716 !!!!
helidrive schrieb am 17.02.2016:
Muß mich korrigieren, hatte einen Fehler bei der Formatumwandlung.
 

Logge dich ein, um hier zu kommentieren!