Hallo Armin!
captain_hesse hat geschrieben:[...] es sollte nun fehlerfrei sein.
Ja, das denke ich auch.
captain_hesse hat geschrieben:Dann habe ich noch versucht eine Routine zu schreiben die das selbe macht aber nicht rekusiv ist wie du vorgeschlagen hast, allerdings ist es mir bisher nicht gelungen diese schneller zu bekommen als die rekursive Routine. Vieleicht kannst Du ja mal was Posten wie eine Routine, die von 0 bis 999999 zählt deiner Meinung nacht aussehen soll und dabei aber auch schneller ist als das rekursive Programm.
Ich meinte vor allem: schneller als Dein erster Code.

Dein erster Code benötigte hier bei mir 2600 ms(!), während Dein neuer Code nur noch 78 ms braucht.

( Du hast übrigens ein bisschen geschummelt, weil Du in der 1. Zeile des Programms eigentlich noch gar nicht wissen kannst, dass das Array
var$() mit 26000 Elementen ausreichend groß dimensioniert ist.

)
Wichtig:
Bei Zeitmessungen immer den Debugger ausschalten (dann natürlich auch keine Meldungen mit
Debug ausgeben!
Na, mal sehen wie weit ich komme.
Hier erst mal Code von mir, der vor allem
einfach ist:
Code: Alles auswählen
EnableExplicit
Procedure.i QuerSumme (n.i)
; in: n: >= 0
Protected temp.i, ziffer.i, ret.i=0
temp = n
While temp
ziffer = temp % 10
ret + ziffer
temp/10
Wend
ProcedureReturn ret
EndProcedure
Define.i stellen, summe, last, x, count, t, i
Define msg$
stellen = 6
summe = 36
t = ElapsedMilliseconds()
NewList zahl.i()
last = Pow(10, stellen) - 1
count = 0
For x = 0 To last
If QuerSumme(x) = summe
count + 1
AddElement(zahl())
zahl() = x
EndIf
Next
i = Random(count-1) ; Das erste Element der Liste ist an Position 0.
SelectElement(zahl(), i)
t = ElapsedMilliseconds() - t
msg$ = Str(count) + " Kombinationen mit Summe " + Str(summe) + " gefunden." + #LF$
msg$ + "Zufällig ausgewählt: " + #DQUOTE$ + Str(zahl()) + #DQUOTE$ + " (Kombination #" + Str(i) + ")" + #LF$
msg$ + "Dauer: " + Str(t) + " ms"
MessageRequester("Ergebnis", msg$)
Dauer hier: 190 ms
Man kann das noch
deutlich beschleunigen, indem man einen passenden Startwert berechnet, und dann
in 9er-Schritten hochzählt. Dabei werden keine gültigen Ergebnisse ausgelassen. Man erhält allerdings immer noch einige ungültige Zahen, so dass es weiterhin nötig ist, die Quersumme jeder Zahl zu prüfen:
Code: Alles auswählen
EnableExplicit
Procedure.i QuerSumme (n.i)
; in: n: >= 0
Protected temp.i, ziffer.i, ret.i=0
temp = n
While temp
ziffer = temp % 10
ret + ziffer
temp/10
Wend
ProcedureReturn ret
EndProcedure
Define.i stellen, summe, rest, start, last, i, x, count, t
Define msg$
stellen = 6
summe = 36
t = ElapsedMilliseconds()
NewList zahl.i()
; -- kleinste gesuchte Zahl ermitteln
rest = summe
start = 0
For i = 1 To stellen
If rest > 9
start*10 + 9
rest - 9
Else
start*10 + rest
Break
EndIf
Next
; -- alle gesuchten Zahlen ermitteln und speichern
last = Pow(10, stellen) - 1
count = 0
For x = start To last Step 9
If QuerSumme(x) = summe
count + 1
AddElement(zahl())
zahl() = x
EndIf
Next
i = Random(count-1) ; Das erste Element der Liste ist an Position 0.
SelectElement(zahl(), i)
t = ElapsedMilliseconds() - t
msg$ = Str(count) + " Kombinationen mit Summe " + Str(summe) + " gefunden." + #LF$
msg$ + "Zufällig ausgewählt: " + #DQUOTE$ + Str(zahl()) + #DQUOTE$ + " (Kombination #" + Str(i) + ")" + #LF$
msg$ + "Dauer: " + Str(t) + " ms"
MessageRequester("Ergebnis", msg$)
Dauer hier: 20 ms
Etwas in der Art lässt sich natürlich statt mit Integer-Zahlen auch mit einem Ziffern-Array machen.
Grüße, Nino