Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1896 | Besucher online: 611
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Multiplikation von übergroßen Zahlen


Autor: Tim Hartwig
Sprache: VB.NET
Bewertung:
8.53 (4 votes)
Anzahl der Aufrufe: 8015
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.

Abgelegt unter: Multiplikation, Mathe.



Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
''' <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
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Günther Foidl schrieb am:  25.09.2008 19:08:17

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 12:38:15

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 15:46:10

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


Diese Snippets könnten für Sie interessant sein:
[C#] Summe 1..n berechnen
[C#] Fibonacci-Folge berechnen
[C#] n-te Fibonaccizahl rekursiv berechnen
[C#] Summe 1²...n² berechnen.
[C#] Summe 1³..n³ berechnen.
[C#] größten gemeinsamen Teiler berechnen.
[C#] Dreiecksberechnung
[VB.NET] PI nach der Bailey-Borwein-Plouffe-Formel berechnen
[VB.NET] Quadratische Gleichung mit der PQ Formel lösen
[VB.NET] Basisrechenfunktionen für einen Kreis
[C++] Exponents
[C#] Quersummenberechnung
[C#] Geodaten in sexagesimal Format umrechnen
[VB.NET] Größten gemeinsamen Teiler berechnen
[VB.NET] Quadratwurzel ohne Sqrt() Funktion ziehen
[C#] Addiere alle ganzen Zahlen von x bis y
[C++] Caesar
[C#] "echte" Teiler Summe berechnen
[C#] Formelevaluierung aus RPN Form
[C#] Prüfung auf narzisstische Zahlen
[C#] CellMatrix
[C#] Maschinengenauigkeit
[C#] Flächenberechnungen am Kreis,Quadrat,Parallelogramm,Trapez
[C#] Bruch-Klasse
[VB.NET] einfacher rekursiver Mathe Parser
[VB.NET] Permutation nachweisen
[VB.NET] Das Sieb des Eratosthenes
[VB.NET] Primfaktorzerlegung
[VB.NET] Größter gemeinsamer Teiler
[VB.NET] Modulare Exponentation
[VB.NET] Fibonacci-Folge iterativ erzeugen
[VB.NET] Das Sieb von Atkin
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Werte zweier Variablen tauschen
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Binäre Exponentation
[VB.NET] Größter gemeinsamer Teiler (2)
[VB.NET] Binomialkoeffizient
[VB.NET] Kleinster natürlicher Teiler > 1
[VB.NET] Das Sieb von Atkin (2) - aktuell
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.