Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1380to1384
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kleines Problem mir VBA

Kleines Problem mir VBA
24.09.2014 08:27:13
Alifa
Guten Morgen,
ich versuche, dieses Problem mit VBA zu lösen:
Von der Zahl 8 ausgehend, soll mittels 3 Rechenoperationen die Zahl 91 berechnet werden. Die Rechenoperationen:1)n/2; 2)n*10; 3)n*10+8. Operation 1) ist nur bei geraden Zahlen erlaubt. Diese Op. können beliebig oft angewandt werden. Beispiel:Die Zahl 55 soll berechnet werden. 8*10+8=88=>88*10=880=>880/2=440=>440/2=220=>220/2=110=>110/2=55.
Kann jemand helfen?
Gruß, Erhard

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kleines Problem mir VBA
24.09.2014 08:55:09
Jack_d
Hallo Erhard
Ich stell mich grad schwer die Logik hinter deinem Problem zu finden.
Oder anders formuliert, wie bringt man dem Programm bei, was es zu tun hat?
Die Schwierigkeit die ich sehe ist die fehlende Stringenz in der abfolge der Operationen.
Ich könnte mir lediglich vorstellen, das ganze über 3 Funktionen und eine MainSub abzubilden.
ABER hier fehlen mir die logischen Kriterien. " Welche function soll aufgerufen werden"
Wie löst du denn händisch dieses Problem? Vielleicht auch am Beispiel deiner 8 & 55 erklärt?
Grüße

AW: Kleines Problem mir VBA
24.09.2014 14:01:47
Alifa
Hi Jack,
wenn 8("/2","*10"*,"*10+8")...das Ergebnis weiter("/2","*10"*,"*10+8")...usw bis die gesuchte Zahk, hier 55 gefunden wird. Mit 8 beginnt man, es folgt EINE der 3 Operationen. Das erhaltenen Ergebnis wird desgleichen mit einem der 3 möglichen "Element" ergänzt und berechnet...bis das Ziel(hier die Zahl 55) erreicht ist. Ich stell mir das in etwa so vor, dass man ein Array("/2","*10"*,"*10+8") festlegt und dann mit "Evaluate" die Berechnung einleitet. Händisch etwa so: 8, probier "/2"; probier weiter mit "/2";...und so weiter alle Möglichkeiten probieren. Zunächst das Ganze 10 Mal. Die Zwischenergebnisse nach jedem Schritt sollen ausgegeben werden. Hier 88,880,440,220,110,55.
Gruß, Erhard

Anzeige
AW: Kleines Problem mir VBA
25.09.2014 10:02:56
Alifa
Hi,
hier mein Ansatz, irgendwie klappt das noch nicht.
Gruß, Erhard

Option Explicit
'Von  der Zahl N = 8 aus, kann man drei Operationen ausführen:
'N durch 2 teilen, (darf nur gewählt werden wenn N gerade ist),
'N mit 10 multiplizieren,
'N mit 10 multiplizieren und 8 zum Produkt zählen.
'Ziel ist es von der 8 aus zu jeder andere Zahl zu gelangen.
'Z.B: zu der 91:
'8, 4, 2, 28, 288, 144, 72, 728, 364,182, 91
'Wie erreicht man nun a)  58 und b)  59?
Sub Test2509014()'hier wird das Beispiel behandelt
Dim n0, n1, n2, n3, n4, n5, n6, n7, n8, n9
Dim z%, t!, p
Dim i0&, i1&, i2&, i3&, i4&, i5&, i6&, i7&, i8&, i9&
Cells.ClearContents
t = Timer
For i0 = 0 To 2
For i1 = 0 To 2
For i2 = 0 To 2
For i3 = 0 To 2
For i4 = 0 To 2
For i5 = 0 To 2
For i6 = 0 To 2
For i7 = 0 To 2
For i8 = 0 To 2
For i9 = 0 To 2
p = Array("/2", "*10", "*10+8")
n0 = Evaluate(8 & p(i1))
n1 = Evaluate(n0 & p(i2))
n2 = Evaluate(n1 & p(i3))
If n2 Mod 2 = 0 Then
n3 = Evaluate(n2 & p(i4))
ElseIf n3 Mod 2 = 0 Then
n4 = Evaluate(n3 & p(i5))
ElseIf n4 Mod 2 = 0 Then
n5 = Evaluate(n4 & p(i6))
ElseIf n5 Mod 2 = 0 Then
n6 = Evaluate(n5 & p(i3))
ElseIf n6 Mod 2 = 0 Then
n7 = Evaluate(n6 & p(i4))
ElseIf n7 Mod 2 = 0 Then
n8 = Evaluate(n7 & p(i5))
ElseIf n8 Mod 2 = 0 Then
n9 = Evaluate(n8 & p(i6))
If n8 = 91 Then
z = z + 1
Cells(1, 1).Resize(, 8) = Array("n0", "n1", "n2", "n3", "n4", "n5", "n6", _
"n7", "n8", "n9")
Cells(z + 2, 1).Resize(, 8) = Array(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9)
End If: End If
Next: Next: Next: Next: Next: Next: Next: Next: Next: Next:
MsgBox Round(Timer - t, 1)
End Sub

Anzeige
AW: Kleines Problem mir VBA
25.09.2014 14:22:02
Peter
Hallo
Ich hab dir ja schon eine Lösung geschickt! Ist das eine Programmieraufgabe (wer hat die beste /schnellste Lösung) oder dein eigenes Interesse an VBA (in diesem Fall versuch das Problem über eine rekursive Funktion zu lösen)

AW: Kleines Problem mir VBA
25.09.2014 19:39:40
Alifa
Hi,
die Prozedur soll auch für andere Zahlen(außer 91) anwendbar sein. Hatte 91 gewählt, um an einem Beispiel, mit einfacher Lösung, die Aufgabe zu verdeutlichen. Rekursive Funktion? Klingt gut. Bin dankbar für eine Lösung in dieser Richtung. Was muss ich an deiner Sub ändern, um Z.B. die Zahl 58 zu ermitteln? Es ist keine Programmieraufgabe, im Sinne deiner Frage, sondern die Attraktivität von VBA.
Grüße Erhard

Anzeige
AW: Kleines Problem mir VBA
26.09.2014 08:31:13
Alifa
Hi,
da waren einige Fehler drin. So klappt das jetzt mit 91. Wäre sehr dankbar, wenn eine Lösung gefunden wird, wo auch andere Werte eingesetzt werden können.
Gruß Erhard

Sub Test2609014()
Dim n0, n1, n2, n3, n4, n5, n6, n7, n8, n9
Dim z%, t!, p
Dim i0&, i1&, i2&, i3&, i4&, i5&, i6&, i7&, i8&, i9&
Cells.ClearContents
t = Timer
For i0 = 0 To 2
For i1 = 0 To 2
For i2 = 0 To 2
For i3 = 0 To 2
For i4 = 0 To 2
For i5 = 0 To 2
For i6 = 0 To 2
For i7 = 0 To 2
For i8 = 0 To 2
For i9 = 0 To 2
p = Array("/2", "*10", "*10+8")
n0 = Evaluate(8 & p(i0))
n1 = Evaluate(n0 & p(i1))
n2 = Evaluate(n1 & p(i2))
If n2 Mod 2  0 Then Exit For
n3 = Evaluate(n2 & p(i3))
If n3 Mod 2  0 Then Exit For
n4 = Evaluate(n3 & p(i4))
If n4 Mod 2  0 Then Exit For
n5 = Evaluate(n4 & p(i5))
If n5 > 20000 Then Exit For
If n5 Mod 2  0 Then Exit For
n6 = Evaluate(n5 & p(i6))
If n6 > 20000 Then Exit For
If n6 Mod 2  0 Then Exit For
n7 = Evaluate(n6 & p(i7))
If n7 > 20000 Then Exit For
If n7 Mod 2  0 Then Exit For
n8 = Evaluate(n7 & p(i8))
If n8 > 20000 Then Exit For
If n8 Mod 2  0 Then Exit For
n9 = Evaluate(n8 & p(i9))
If n9 = 91 Then
z = z + 1
Cells(1, 1).Resize(, 10) = Array("n0", "n1", "n2", "n3", "n4", "n5", "n6", _
"n7", "n8", "n9")
Cells(z + 2, 1).Resize(, 10) = Array(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9)
End If:
Next: Next: Next: Next: Next: Next: Next: Next: Next: Next:
MsgBox Round(Timer - t, 1)
End Sub

Anzeige
AW: Kleines Problem mir VBA
26.09.2014 09:41:04
Peter
Hallo
Anbei ein Beispiel für die rekursive Lösung. In Zelle A1 kannst du jeden beliebigen Wert eintragen in Zelle C1 die Suchtiefe (je kleiner um so schneller aber auch mit dem Nachteil das keine Lösung gefunden wird, dann Suchtiefe erhöhen. Andererseits kann eine zu hohe Suchtiefe zu einer nicht optimalen Lösung führen. Daher bei einer gefunden Lösung auch eine Ebene tiefer probieren (E1-1). Das ist gut bei Eingabe von "80" und Suchtiefe 18 zu beobachten). Eine gutes Beispiel ist die Zahl 183 (braucht eine Suchtiefe von 23). Es ist eine weitere Einschränkung im Code vorhanden: MaxLong = 20000. Ich bin davon ausgegangen das kein Lösungweg einer höhere Zahl beinhalten (Geschwindigkeits Optimierung).
https://www.herber.de/bbs/user/92826.xlsm

Anzeige
AW: Kleines Problem mir VBA
26.09.2014 11:45:24
Alifa
Hi Peter
habe "third Part" in der Sub geändert(8 auf 4), die dritte Op. mutiert in *10+4. Zu finden:48. Suchtiefe 16. In Zeile 16 ergibt das 37,40625, also eine Dezimalzahl. Mit der Zeit läuft das phantastisch! Mein Makro braucht einige Minuten, während das braucht unter 1 Sekunde! Was muss ich im Code ändern, damit der dritte Therm "*10+4" wird (anstelle "*10+8") und keine Dezimalzahl ermittelt wird?
Gruß Erhard

AW: Kleines Problem mir VBA
26.09.2014 13:03:41
Alifa
Vielen Dank. Das klappt jetzt. Für 16 Schritte, unter einer Sekunde, beeindruckend!
Viele Grüße und ein schönes Wochenende
Erhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige