Ich bräuchte einen Code für Excel 2007/10,
der Zwei große Zahlen zerlegt und die Einzelnen Ziffern miteinnander multiplieziert(wie beim schriftlichem multiplizieren.
Das Ergebnis soll als String mit Punkt davor ausgegeben werden.
Die einzelen Zahlen = Inputbox
Danke für jede schnelle Antwort
das geht nicht:
Die Berechnung der Summe aus den Einzelzahl-Multiplikationen ergibt immer eine Zahl, die zu groß ist für das Zahlensystem des PC. Damit könnte ich dann zwar theoretisch mal 3 nehmen , es als 10.000 darstellen (Nullen anhängen), aber irgendwann ist Schluss, spätestens, wen ich die Einer-, Zehner-, Hunderter-, Tausender-, …Milliarden-Multiplikation zusammen zählen muss. Da hilft auch kein String (der kann eigentlich nicht rechnen, wenn er rechnet, dann vorübergehend im Zahlensystem des PC)
Hallo Hans,
Ich kann mir das nicht genau vorstellen, wie das nachher aussehen soll. Kannst Du mir ein Beispiel schicken? Welche Werte brauchst du?
Gruß
Arnold
Bitte sehr:
Option Explicit
Sub Multi()
Dim Z1T As Variant
Dim Z2T As Variant
Z1T = InputBox(„Bitte geben Sie die erste Zahl ein.“)
Z2T = InputBox(„Bitte geben Sie die zweite Zahl ein.“)
Dim L1 As Long
Dim L2 As Long
L1 = Len(Z1T)
L2 = Len(Z2T)
ReDim Z1(1 To L1) As Integer
ReDim Z2(1 To L2) As Integer
ReDim P(1 To L2, 0 To 2 * L1) As Integer
Dim I As Long
Dim J As Long
Dim Rest As Long
For I = 1 To L1
Z1(I) = Mid(Z1T, I, 1)
Next I
For I = 1 To L2
Z2(I) = Mid(Z2T, I, 1)
Next I
For I = 1 To L2 'ein Durchgang für jede Stelle von Z2
Rest = 0
For J = L1 To 1 Step -1 'mit jeder Stelle mutliplizieren, Rest weiterschleppen
P(I, I + J - 1) = (Z1(J) * Z2(I) + Rest) Mod 10
Rest = Int((Z1(J) * Z2(I) + Rest) / 10)
Next J
If Rest > 0 Then
P(I, I - 1) = Rest
End If
Next I
'jetzt addieren
Dim Erg As Variant
Erg = „“
Rest = 0
For I = 2 * L1 - 1 To 0 Step -1
For J = 1 To L2
Rest = Rest + P(J, I)
Next J
Erg = Trim(Str(Rest Mod 10)) & Erg
Rest = Int(Rest / 10)
Next I
Erg = Trim(Str(Rest)) & Erg
'Debug.Print Erg
MsgBox „.“ & Erg, vbOKOnly, „Ergebnis“
End Sub
Schnell genug?
lg
Katharina
Hallo
Hast du denn schon etwas Code geschrieben, der Du uns geben kannst?
Grundlegend:
Dim dblM as Double
dblM=0
txt = inputbox(„Wert“)
For i=1 to len(txt)
dblM = dblM * cdbl(mid(txt,i,1))
Next i
Grüsse Sebastian
Hallo hansderspinner,
auf dem Gebiet bin ich leider nicht der Experte.
Gruß Hugo
Hallo hansderspinner (was für ein Name?).
Die Inputboxen sind nicht das Problem, kriegste wahrscheinlich selber hin. Beim Zerlegen denkst Du, vermute ich, an Primfaktoren?
Da habe ich nicht die nötigen Fertigkeiten greifbar. Habe neulich einen Code gesehen, der die Ausgangszahlen über eine Schleife von 2 bis zur Quadratwurzel in Primfaktoren zerlegt. Bringe ich aber leider nicht mehr zusammen.
der Zwei große Zahlen zerlegt und die Einzelnen Ziffern
miteinnander multiplieziert(wie beim schriftlichem
multiplizieren.
Das Ergebnis soll als String mit Punkt davor ausgegeben
werden.
Die einzelen Zahlen = Inputbox
Danke für jede schnelle Antwort
Trotdem viel Erfolg bei der Suche.
MfG MwieMichel
Ich empfehle dir die Microsoft Excel Hilfe!
Danke erst mal!
Aber ginge das auch als Tabellenblattfunktion(ohne Inputboxen, wegen mir A1 und A2)
Ja. Statt Inputboxblabla gehört Range(A1) bzw. Range(A2).
Je exakter der Wunsch desto passender die Lösung
Danke erst mal!
Aber ginge das auch als Tabellenblattfunktion(ohne Inputboxen,
wegen mir A1 und A2)
Hallo,
das ist eine etwas komplexere Aufgabe, die ich ungefähr so angehen würde:
- beide Zahlen in einen Zeilenvektor einlesen
- Schrittweise multiplizieren, dabei jedes Ergebnis wiederum in einen Zeilenvektor einlesen
- auf das spaltenweise Addieren der Zwischenergebnisse würde ich verzichten, sondern das Ergebnis durch Multiplikation der beiden Zahlen erzeugen und auch dieses wieder in einen Zeilenvektor schreiben.
- die einzelnen Zeilenvektoren in ein mit nicht proportionaler Schrift, z.B. Courier, formatiertes Textfeld ausgeben.
Pseudocode für das Umwandeln einer Zahl in einen Zeilenvektor:
i=1
solange Zahl > 1
a(i)=(zahl-zahl/10)*10 'gibt glaube auch eine Fkt zur Ausgabe der Nachkommastellen
zahl=int(zahl/10)
Unter der Vorraussetzung, dass die Einer jeweils auf A(1) und B(1) liegen, hier der Pseudocode für die Multiplikation A()*B():
y=1
z=1
t=0
For i=1 to Anzahl(B())
For j=1 to Anzahl(A())
t1=b(i)*A(j)
E(y,z)=frac((t1+t)/10)
t=int((t1+t)/10)
z=z+1
nächstes A
y=y+1
nächstes B
Das alles nur als grobe Ideensammlung.
Gruß
Vincenz
Hallo hansderspinner,
Zunächst mal: wie groß sind die Zahlen? Wenn das sehr große Zahlen sind, kann das schon zu Performance-Problemen führen.
Ich würde das ganze mit zwei Arrays lösen, die dann einzeln durchlaufen werden.
Also: Zahlen mit Split() aufsplitten in Arrays und dann
arr1(a) x arr2(b) => Ergebnis wieder aufdröseln in Einer/Zehner (wie in Grundschule gelernt).
Evtl. hilft dir auch Excel:
http://office.microsoft.com/de-de/excel-help/mmult-H…
http://www.helmholtz-bi.de/uangebot/faecher/mathe/ne…
Gruß
Harry
Hallo,
da gibt es natürlich einige Wege. Hier mal eine Variante, in der ich Arrays für die Einzelschritte hernehme:
'------------------------------------------------------------------------------------
’ erwartet Strings, die gültige Ganzahlen darstellen
’ gibt String der Multiplikation dieser Parameter zurück
Public Function multiplyStrings(zahl1 As String, zahl2 As String) As String
Dim zahl1Lng As Integer
Dim zahl2Lng As Integer
Dim aZahl1() As String
Dim aZahl2() As String
Dim tmpResult() As String
Dim i As Integer
Dim k As Integer
zahl1Lng = Len(zahl1)
zahl2Lng = Len(zahl2)
’ Initialisierung
ReDim aZahl1(zahl1Lng - 1)
ReDim aZahl2(zahl2Lng - 1)
ReDim tmpResult(zahl1Lng + zahl2Lng)
aZahl1 = Split(Left(StrConv(zahl1, vbUnicode), Len(StrConv(zahl1, vbUnicode)) - 1), vbNullChar)
aZahl2 = Split(Left(StrConv(zahl2, vbUnicode), Len(StrConv(zahl2, vbUnicode)) - 1), vbNullChar)
For i = 0 To zahl1Lng + zahl2Lng
tmpResult(i) = „0“
Next i
’ Ziffern multiplizieren und zu vorangehendem Ergebnis addieren
For i = zahl1Lng - 1 To 0 Step -1
For k = zahl2Lng - 1 To 0 Step -1
tmpResult(i + k + 2) = CStr(CInt(tmpResult(i + k + 2)) + CInt(aZahl1(i)) * CInt(aZahl2(k)))
Next k
Next i
’ Uberträge verrechnen
For i = UBound(tmpResult) - LBound(tmpResult) To 0 Step -1
If Len(tmpResult(i)) > 1 Then
tmpResult(i - 1) = CStr(CInt(tmpResult(i - 1)) + CInt(Left(tmpResult(i), Len(tmpResult(i)) - 1)))
End If
tmpResult(i) = Right(tmpResult(i), 1)
Next i
’ führende 0 trimmen
multiString = Replace(LTrim(Replace(Join(tmpResult, „“), „0“, " ")), " ", „0“)
End Function
'------------------------------------------------------------------------------------
Da kann man sicherlich noch einiges optimieren/anpassen, wie zum Beispiel das Einbeziehen von Fließkommawerten, aber grundsätzlich sollte es funktionieren.
gegrüßt!
Über ein Feedback, ob das nun so passt, tät’ ich mich freuen. Motiviert mich für die Zukunft
lg
Katharina
Hallo,
anbei mal ein Script das dies mit 2 Zahlen in Zelle A1 und B1 macht.
Du müsstest es dann nur noch dementsprechend anpassen,
dass die 2 Zahlen über eine Inputbox eingelesen werden.
Der Algorythmus ist aber der selbe:
hier das Script:
Sub Multiplizieren()
Dim Ergebnis, Zwischenwert As Long
Dim Ausgabe As String
Ergebnis = 1
Wert1 = Cells(1, 1).Value
Wert2 = Cells(1, 2).Value
Wert3 = Wert1 & Wert2
Länge = Len(Wert3)
For i = 1 To Länge
Zwischenwert = Mid(Wert3, i, 1)
Ergebnis = Zwischenwert * Ergebnis
Next i
Ausgabe = „.“ & Ergebnis
MsgBox Ausgabe
End Sub
Gruß,
Ptonka
Das wär der VBA-Code:
Option Explicit
Sub Multi()
Dim Z1T As Variant
Dim Z2T As Variant
Z1T = InputBox(„Bitte geben Sie die erste Zahl ein.“)
Z2T = InputBox(„Bitte geben Sie die zweite Zahl ein.“)
Dim L1 As Long
Dim L2 As Long
L1 = Len(Z1T)
L2 = Len(Z2T)
ReDim Z1(1 To L1) As Integer
ReDim Z2(1 To L2) As Integer
ReDim P(1 To L2, 0 To 2 * L1) As Integer
Dim I As Long
Dim J As Long
Dim Rest As Long
For I = 1 To L1
Z1(I) = Mid(Z1T, I, 1)
Next I
For I = 1 To L2
Z2(I) = Mid(Z2T, I, 1)
Next I
For I = 1 To L2 'ein Durchgang für jede Stelle von Z2
Rest = 0
For J = L1 To 1 Step -1 'mit jeder Stelle mutliplizieren, Rest weiterschleppen
P(I, I + J - 1) = (Z1(J) * Z2(I) + Rest) Mod 10
Rest = Int((Z1(J) * Z2(I) + Rest) / 10)
Next J
If Rest > 0 Then
P(I, I - 1) = Rest
End If
Next I
'jetzt addieren
Dim Erg As Variant
Erg = „“
Rest = 0
For I = 2 * L1 - 1 To 0 Step -1
For J = 1 To L2
Rest = Rest + P(J, I)
Next J
Erg = Trim(Str(Rest Mod 10)) & Erg
Rest = Int(Rest / 10)
Next I
Erg = Trim(Str(Rest)) & Erg
'Debug.Print Erg
MsgBox „.“ & Erg, vbOKOnly, „Ergebnis“
End Sub
… mehr auf http://www.wer-weiss-was.de/app/query/display_query?..