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
Alte URL:
/snippet/multiplikation-von-uebergrossen-zahlen/256
Interessante Möglichkeit. Es gibt auch Möglichkeiten dies mit FFT zu bewerkstelligen. So wird meist in den numerischen Bibliotheken erledigt.
Bei mir stürzt es ab…
http://dotnet-forum.de/forums/p/1225/4484.aspx#4484
plz help….
Ich empfehle generell, immer den kleinstmöglichen Zahlentyp für Variablen zu verwenden. Besonders bei rechenaufwändigen Prozeduren kann es die Rechenzeit immens reduzieren.
Leider rechnet Deine Routine falsch:
Beispiel
2.781.543 x 54 = 150.203.322
und nicht 11.836.716 !!!!
Muß mich korrigieren, hatte einen Fehler bei der Formatumwandlung.