Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1296to1300
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

String prüfen

String prüfen
03.02.2013 11:25:06
Alifa
Hallo,
aus 30 dreistelligen Primzahlen sollen Kombinationen von 8 Primzahlen gebildet werden.
Diese sollen zu einem langen String verknüpft werden. Dieser String soll nun so geprüft werden: Jede folgende dreier Gruppe soll eine Primzahl darstellen und alle sollen verschieden sein. Beispiel: 113131137139173179191193. Die zu prüfenden dreier Gruppen sind dann: 113,131,313,131,311,....193. Dieser String ist FALSE, weil 131 zweimal vorkommt. Auch entstehen Gruppen, die keine Primzahlen sind(z.B. 371) Das ist Freizeitbeschäftigung. Kann mir jemand helfen?
Gruß, Alifa

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: String prüfen
03.02.2013 12:31:13
Hajo_Zi
Excel kann nur 15 Stellen.

AW: String prüfen
04.02.2013 06:24:14
Alifa
Hallo,
ein String kann mit viel mehr Zeichen, als 15 bearbeitet werden.Mein Macro ist leider zu langsam, nach 2 Stunden habe ich es abgebrochen. Vielleicht findet sich doch noch jemand, um mir beim Makro zu helfen.
Grüße, Alifa

AW: String prüfen
04.02.2013 14:19:05
Hajo_Zi
Aber mit einen String hast Du keine zahl und Du wolltest doch was mitZahlen, oder habe ich das falsch in erinnerung?

Anzeige
AW: String prüfen
04.02.2013 15:03:39
Alifa
Der String ist aus Zahlen zusammen gesetzt. Z.B. Der String 113173977331379719919373 beinhaltet genau 8 dreistellige Primzahlen. Das Macro soll Kombinationen je 8 aus 30 dreistelligen Zahlen ermitteln. Für jede einzelne Kombination werden die Bedingungen(wie beschrieben) geprüft. Die Primzahlen: 113,131,137,139,173,179,191,193,197,199,311,313,317,331,337,373,379,397,719,733,739,773,797,911,919,937,
971,977,991,997.
Alifa

AW: String prüfen - vergiss es
04.02.2013 17:54:43
Daniel
Hi
ich glaube, das wird nix.
meinen bescheidenen Kombinatorik-Kenntnissen nach gibts bei 8 aus 30 c.a. 235 Milliarden Kombinationsmöglichkeiten (ohne Doppelte), die du auf Primzahl prüfen musst.
da der Wert nicht als Zahl sondern als Textstring vorliegt, wird diese Primzahlprüfung auch nicht besonders schnell sein.
kannst ja mal spasseshalber ausrechnen, wie lange du warten musst, wenn eine Primzahlprüfung 1/1000 sekunde dauert.
gruß Daniel

Anzeige
AW: String prüfen - vergiss es
05.02.2013 09:02:34
Alifa
Hallo Daniel,
schön, dass du dir Gedanken darüber gemacht hast! Es gibt genau 30!/(22!*8!)=5852925 Kombinationen von 8 aus 30. Mein gebasteltes Makro hat in "Nachtschicht" 22 Lösungen gefunden, ohne alle möglichen Kombinationen zu ermittel. Ich hatte am Morgen unterbrochen. Ist noch zu langsam. Werde jetzt versuchen zu optimieren.
Gruß, Alifa

Primzahlstring
05.02.2013 10:15:05
Erich
Hi Erhard,
hier stehen die 30 Priomzahlen in A1:A30, die 292 Ergebnisse werden in Spalte C (als Text formatieren)
ausgegeben:

Option Explicit
Dim pp() As Integer, dd As Long
Sub Start()
Dim lngP As Long, zz As Long, nn As Long, kk As Long, xx As String
Dim erg As String
dd = Cells(Rows.Count, 1).End(xlUp).Row
ReDim pp(1 To dd)
For zz = 1 To dd
pp(zz) = Cells(zz, 1)
Next zz
zz = 0
For kk = 1 To dd
xx = pp(kk)
For nn = 1 To dd
Tiefensuche xx, nn, zz
Next nn
Next kk
End Sub
Sub Tiefensuche(X As String, jj As Long, zz As Long)
Dim Y As String, ii As Long, ttt As String, kk As Long, erg As String
If InStr(X, pp(jj)) > 0 Then Exit Sub
For kk = 1 To 2
ttt = Right(X, 3 - kk) & Left(pp(jj), kk)
If InStr(X & Left(ttt, 2), ttt) > 0 Then Exit Sub
If Not IsPrime(ttt) Then Exit Sub
Next kk
Y = X & pp(jj)
If Len(Y) 
Bin aber nicht sicher, dass das alles stimmt... :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Primzahlstring
05.02.2013 10:57:11
Alifa
Hallo Erich,
Danke für deinen Beitrag! Mittlerweile habe ich mein Makro optimiert und erhalte in wenigen Sekunden Tausende Ergebnisse. Bei mir erscheint der String nicht explizit. Wie muss ich was einstellen, damit in der Tabelle der String richtig dargestellt wird? Dann kann ich deine Ergebnisse mit meinen vergleichen, um zu sehen, wieso bei mir so viele Ergebnisse erscheinen.
Grüße, Erhard

AW: Primzahlstring
05.02.2013 12:06:47
Erich
Hi Erhard,
die Frage "Wie muss ich was einstellen, damit in der Tabelle der String richtig dargestellt wird?" kann ich nicht
beantworten, denn ich kenne dein Programm nicht, weiß also auch nicht, warum die Strings nicht explizit erscheinen.
Vielleicht zu Klärung: Ist bei dir
113131137331139719191911
ein gültiges Ergebnis?
Bei mir ist
113733131797739719919379 das erste.
Hier eine etwas kürzere und bessere Version:

Option Explicit
Dim pp() As String, dd As Long
Sub Start()
Dim zz As Long, nn As Long, kk As Long
dd = Cells(Rows.Count, 1).End(xlUp).Row
ReDim pp(1 To dd)
For kk = 1 To dd
pp(kk) = Cells(kk, 1)
Next kk
For kk = 1 To dd
For nn = 1 To dd
Backtrack pp(kk), nn, zz
Next nn
Next kk
End Sub
Sub Backtrack(X As String, jj As Long, zz As Long)
Dim Y As String, ii As Long, ttt As String, kk As Long, erg As String
'                                            Abbruchbedingungen
If InStr(X, pp(jj)) > 0 Then Exit Sub
For kk = 1 To 2
ttt = Right(X, 3 - kk) & Left(pp(jj), kk)
If InStr(X & Left(ttt, 2), ttt) > 0 Then Exit Sub
If Not IsPrime(ttt) Then Exit Sub
Next kk
Y = X & pp(jj)
If Len(Y) 
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Primzahlstring
05.02.2013 14:59:06
Alifa
113131137331139719191911 ist nicht WAHR, weil unter anderem 113 drei Mal vorkommt.
Meine erste ist:113137331739719919379773
Deine erste wird bei mir so dargestellt:1,13733131797739E+23
Gruß, Erhard

AW: Primzahlstring
05.02.2013 17:53:58
Erich
Hi Erhard,
ja, das sehe ich auch so, dass 113131137331139719191911 falsch ist.
Die Zahldarstellung meines ersten Ergebnisses erscheint, wenn du die Zelle nicht vorherals Text formatiert hast.
Schickst du mir dein Programm, dann kann ich mal vergleichen.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Primzahlstring
05.02.2013 19:44:55
Alifa
Hi Erich,
hier mein Makro. Da ich mit dem String nicht zurecht kam, habe ich die dreistelligen
Primzahlen in verschiedene Spalten ausgelagert.

Option Explicit
Sub StringPrim()
Dim a1, a2, a3, a4, a5, a6, a7, a8
Dim z%, t!, p, b, c
Dim b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, _
b13, b14, b15, b16
t = Timer
Cells.ClearContents
p = Array(113, 131, 137, 139, 173, 179, 191, 193, 197, 199, 311, 313, 317, 331, _
337, 373, 379, 397, 719, 733, 739, 773, 797, 911, 919, 937, 971, 977, 991, 997)
For Each a1 In p
For Each a2 In p
b1 = CInt(Right$(a1, 2) & Left$(a2, 1))
b2 = CInt(Right$(a1, 1) & Left$(a2, 2))
If Ve(Array(b2, b1, a2, a1)) Then
For Each a3 In p
b3 = CInt(Right$(a2, 2) & Left$(a3, 1))
b4 = CInt(Right$(a2, 1) & Left$(a3, 2))
If Ve(Array(b4, b3, a3, b2, b1, a2, a1)) And Prüfen(CStr(a1 & a2 & a3)) Then
For Each a4 In p
b5 = CInt(Right$(a3, 2) & Left$(a4, 1))
b6 = CInt(Right$(a3, 1) & Left$(a4, 2))
If Ve(Array(b6, b5, a4, b4, b3, a3, b2, b1, a2, a1)) And Prüfen(CStr(a1 & a2 & a3 & a4)) Then
For Each a5 In p
b7 = CInt(Right$(a4, 2) & Left$(a5, 1))
b8 = CInt(Right$(a4, 1) & Left$(a5, 2))
If Ve(Array(b8, b7, a5, b6, b5, a4, b4, b3, a3, b2, b1, a2, a1)) _
And Prüfen(CStr(a1 & a2 & a3 & a4 & a5)) Then
For Each a6 In p
b9 = CInt(Right$(a5, 2) & Left$(a6, 1))
b10 = CInt(Right$(a5, 1) & Left$(a6, 2))
If Ve(Array(b10, b9, a6, b8, b7, a5, b6, b5, a4, b4, b3, a3, b2, b1, a2, a1)) _
And Prüfen(CStr(a1 & a2 & a3 & a4 & a5 & a6)) Then
For Each a7 In p
b11 = CInt(Right$(a6, 2) & Left$(a7, 1))
b12 = CInt(Right$(a6, 1) & Left$(a7, 2))
If Ve(Array(b12, b11, a7, b10, b9, a6, b8, b7, a5, b6, b5, a4, b4, b3, a3, b2, b1, a2, a1)) _
And Prüfen(CStr(a1 & a2 & a3 & a4 & a5 & a6 & a7)) Then
For Each a8 In p
b13 = CInt(Right$(a7, 2) & Left$(a8, 1))
b14 = CInt(Right$(a7, 1) & Left$(a8, 2))
If Ve(Array(b14, b13, a8, b12, b11, a7, b10, b9, a6, b8, b7, _
a5, b6, b5, a4, b4, b3, a3, b2, b1, a2, a1)) _
And Prüfen(CStr(a1 & a2 & a3 & a4 & a5 & a6 & a7 & a8)) Then
b = CStr(a1 & a2 & a3 & a4 & a5 & a6 & a7 & a8)
z = z + 1
If z = 1000 Then Exit Sub
Cells(z + 2, 1).Resize(, 8) = Array(a1, a2, a3, a4, a5, a6, a7, a8)
Cells(1, 1).Resize(, 8) = Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8")
Columns.AutoFit
End If: Next: End If: Next: End If: Next: End If: Next: End If: Next:
End If: Next: End If: Next: Next
Columns.AutoFit
MsgBox Round(Timer - t, 1)
End Sub
Function Prüfen(ByVal s As String) As Boolean
Dim i&
For i = 1 To Len(s) - 2
If Not Prim(Mid$(s, i, 3)) Then Exit Function
Next:
Prüfen = True
End Function
Function Prim(ByVal z&) As Boolean
Dim X%
For X = 3 To Int(Sqr(z))
If z Mod X = 0 Then Prim = False: Exit Function
Next X
Prim = True
End Function
Private Function Ve(arrWerte) As Boolean 'prüft, ob alle Variabeln
Dim ii As Long, oCollection As New Collection 'unterschiedlich sind
On Error GoTo Fehler ' von Franz
Ve = True ' If Ve(array(a1,a2,...)) Then
For ii = LBound(arrWerte) To UBound(arrWerte)
oCollection.Add arrWerte(ii), CStr(arrWerte(ii))
Next
Fehler:
If Err.Number  0 Then
Ve = False
End If
Set oCollection = Nothing
End Function

Gruß, Erhard

Anzeige
AW: Primzahlstring
06.02.2013 12:05:24
Erich
Hi Erhard,
jetzt habe ich eine Version, bei der genau die 2565 Ergebnisse erscheinen, die dein Programm zeigt.
In deinem Code kannst du den (ja bereits erstellen) String b ausgeben, mit
Cells(z + 2, 1) = b
statt
Cells(z + 2, 1).Resize(, 8) = Array(a1, a2, a3, a4, a5, a6, a7, a8)
Hier mein neuer Code:

Option Explicit
Dim pp() As String, dd As Long, zz As Long
Sub Start()
Dim nn As Long, kk As Long
dd = Cells(Rows.Count, 1).End(xlUp).Row   ' 30 im Beispiel
ReDim pp(1 To dd)
For kk = 1 To dd
pp(kk) = Cells(kk, 1)
Next kk
For kk = 1 To dd
For nn = 1 To dd
Backtrack pp(kk), nn
Next nn
Next kk
End Sub
Sub Backtrack(X As String, jj As Long)
Dim Y As String, ii As Long, ttt As String, kk As Long, erg As String
' Abbruchbedingungen
For kk = 0 To 2
ttt = Right(X, kk) & Left(pp(jj), 3 - kk)
If InStr(Left(X & pp(jj), Len(X) + 2 - kk), ttt) > 0 Then Exit Sub
If Not IsPrime(ttt) Then Exit Sub
Next kk
Y = X & pp(jj)                            ' neuer String
If Len(Y)  10000 Then Stop
End If
End Sub
Private Function IsPrime(ByVal lngN As Long) As Boolean
Dim ii As Long
If lngN = 2 Then IsPrime = True: Exit Function
If lngN / 2 = Int(lngN / 2) Then Exit Function
For ii = 3 To Int(Sqr(lngN)) Step 2
If lngN / ii = Int(lngN / ii) Then Exit Function
Next
IsPrime = True
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Primzahlstring
06.02.2013 19:58:00
Alifa
Hi Erich,
Das Problem mit der Darstellung des String habe ich mit der Zeile: Range("c1:c3000").NumberFormat="@"
gelöst. Dein Makro braucht bei mir 6,5 Sekunden, mein Makro braucht 107 Sekunden. Noch einmal herzlichen Dank für die professionelle Hilfe!
Gtuß, Erhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige