also ich hab mal vor einen "primzahlen zerleger" zu schreiben, und habe folgendes start-problem...
ich habe primzahlen zahlen... zb
"2,3,5,7"
dann will ich eine beliebige zahl (ausm Input) solange mit der "2" dividiren, solange es eine eine "ganze" zahl als lösung kommt,
andersnfalls (mit komma) soll weiter mit der "3" machen, wenns nicht geht, "5"... dann wieder "2" usw...
also ich hab mal vor einen "primzahlen zerleger" zu schreiben, und habe folgendes start-problem...
ich habe primzahlen zahlen... zb
"2,3,5,7"
dann will ich eine beliebige zahl (ausm Input) solange mit der "2" dividiren, solange es eine eine "ganze" zahl als lösung kommt,
andersnfalls (mit komma) soll weiter mit der "3" machen, wenns nicht geht, "5"... dann wieder "2" usw...
also ich hab mal vor einen "primzahlen zerleger" zu schreiben, und habe folgendes start-problem...
ich habe primzahlen zahlen... zb
"2,3,5,7"
dann will ich eine beliebige zahl (ausm Input) solange mit der "2" dividiren, solange es eine eine "ganze" zahl als lösung kommt,
andersnfalls (mit komma) soll weiter mit der "3" machen, wenns nicht geht, "5"... dann wieder "2" usw...
nur weiß ich jetz nicht, wie ich das so einrichten kann, dass es alle primzahlen nacheinander nimmt...
müsste ichs in ne .ini speichern und von da aus zeile für zeile nehmen?
wie würde es dann da aussehen?
zum testen obs ne ganze zahl ist mach ichs ja hiermit oder?
If IsInt(variable)...
MfG
Mit den ersten 30 Primzahlen kannst du aber bei weitem nicht alle Zahlen zerlegen. Am besten du rechnest die Primzahlen im Script direkt aus, so bist du nicht auf die ersten 30 beschränkt. Hier ein algo der das kann.
Dass mit den von 2 anfangen kannst du dir im Grunde auch schenken, das würde in einer endlosschleife enden, da die letze Zahl selbst eine Primnzahl ist und somit nur durch sich selbst oder 1 teilbar wäre.
Aber hier das Script mit den neustart , vielleicht etwas "leserlicher" als lolkop seins :
schonmal danke euch beiden, ist fasst so, wie ichs wollte...
(eig. wollte ichs ja selber "versuchen" zu scripten, aber...hätte ich wohl nicht so geschaft....^^)
Wie gesagt, dass Script bricht bei höheren Zahlen ab, da die benötigten Primzahlen zur berechnung nicht in den array bereitgestellt sind. Du solltest dir am besten die Primzahlen zu Laufzeit des Scriptes direkt ausrechnen, oder eine Begrenzung einbauen.
Edit: Außerdem war noch nen Bug drinne, wenn du zweimal hintereinander eine Zahl suchst. is gefixt.
öhm du hast statt einer in diesem fall besseren for schleife eine while schleife genommen, was anstatt in einer endlosschleife zu landen, beim nicht auffinden einer passenden primzahl zu einem array overflow führen wird.
es ist zwingen notwendig die schleife nur von 0-29 laufen zu lassen, da sonst $prim[29+] abgefragt wird, was nicht existiert. und aus effizienzgründen ist eine for schleife auch immer eine while schleife vorzuiziehen :P
öhm du hast statt einer in diesem fall besseren for schleife eine while schleife genommen, was anstatt in einer endlosschleife zu landen, beim nicht auffinden einer passenden primzahl zu einem array overflow führen wird.
es ist zwingen notwendig die schleife nur von 0-29 laufen zu lassen, da sonst $prim[29+] abgefragt wird, was nicht existiert. und aus effizienzgründen ist eine for schleife auch immer eine while schleife vorzuiziehen :P
Darauf hab ich gewartet. Und deine komische for...next do...until combo ist jetzt nach eingehenden tests von unabhängigen instituten die effektivste aller Lösungen?!
Außerdem hab ich ihn darauf hingewiesen dass das Script abbricht, man könnte um das zu umgehen einfach folgendes einbauen.
Darauf hab ich gewartet. Und deine komische for...next do...until combo ist jetzt nach eingehenden tests von unabhängigen instituten die effektivste aller Lösungen?!
Außerdem hab ich ihn darauf hingewiesen dass das Script abbricht, man könnte um das zu umgehen einfach folgendes einbauen.
Dim $array[10]
$t = TimerInit()
For $a = 1 To 100
For $b = 1 To 100
$array[0] = 0
$array[1] = 1
$array[2] = 2
$array[3] = 3
$array[4] = 4
$array[5] = 5
$array[6] = 6
$array[7] = 7
$array[8] = 8
$array[9] = 9
Next
Next
ConsoleWrite("zeitaufwand durch direktes setzen: "&TimerDiff($t)&"ms"&@CRLF)
$t = TimerInit()
For $a = 1 To 100
For $b = 1 To 100
For $x = 0 To 9
$array[$x] = $x
Next
Next
Next
ConsoleWrite("zeitaufwand durch For schleife: "&TimerDiff($t)&"ms"&@CRLF)
$t = TimerInit()
For $a = 1 To 100
For $b = 1 To 100
$x = 0
While $x < 10
$array[$x] = $x
$x+=1
WEnd
Next
Next
ConsoleWrite("zeitaufwand durch While schleife: "&TimerDiff($t)&"ms"&@CRLF)
$t = TimerInit()
For $a = 1 To 100
For $b = 1 To 100
$x = 0
Do
$array[$x] = $x
$x+=1
Until $x > 9
Next
Next
ConsoleWrite("zeitaufwand durch Do schleife: "&TimerDiff($t)&"ms"&@CRLF)
dann erhält man auch vergleichszeiten, gegen die du jetz hoffentlich nichtmehr argumentieren wirst...
Code:
zeitaufwand durch direktes setzen: 88.125068968263ms
zeitaufwand durch For schleife: 105.610629283889ms
zeitaufwand durch While schleife: 221.581793216736ms
zeitaufwand durch Do schleife: 217.137094239631ms
um das ganze noch etwas deutlicher zu machen, kann man auch die for schleifen von 1-500 laufen lassen und erhält:
Code:
zeitaufwand durch direktes setzen: 1558.94142970685ms
zeitaufwand durch For schleife: 2349.61678090372ms
zeitaufwand durch While schleife: 4791.73023387051ms
zeitaufwand durch Do schleife: 4690.06843048488ms
aber auch mit reiner logik sollte klar sein das do until schleifen in diesem falle besser sind, da nach abschluss der aktion direkt ermittelt wird, ob weiter gemacht werden muss. bei der while schleife wird nocheinmal zu start gesprungen, und im falle der fertigen aktion hinter das ende gesprungen.
warum jetzt schleifen allgemein so inneffizient sind gegen über dem direkten setzen kann ich leider nicht sagen. das wurde von autoit leider schlecht umgesetzt, da eig for, do und direktes setzen genau gleiche zeiten haben müssten, da selber asm code...
erstens würde das immernoch zum fehler führen, da ubound die anzahl der elemente zurück gibt, was bei 0-29 leider 30 entspricht.. und auch element 30 existiert nicht.
Wenn du dir die Bedingung richtig angesehen hättest, dann wäre dir vielleicht auch aufgefallen dass die Schleife solange läuft bis $i ungleich 30 ist, also von 0-29.
Außerdem denke ich das mein Code doch bei weitem leserlicher ist als deiner, mag sein das deiner einen geschwindigkeitsvorteil hat. Jedoch stellt sich die Frage ob dem TS ein code der 100ms schneller oder einer der nachvollziehbar geschrieben ist, lieber ist.
Wenn du dir die Bedingung richtig angesehen hättest, dann wäre dir vielleicht auch aufgefallen dass die Schleife solange läuft bis $i ungleich 30 ist, also von 0-29.
da hast du natürlich recht =). habe das leider erst nach dem posten bemerkt und das auch direkt danach wieder gelöscht.
Quote:
Originally Posted by | Moep |
Außerdem denke ich das mein Code doch bei weitem leserlicher ist als deiner, mag sein das deiner einen geschwindigkeitsvorteil hat. Jedoch stellt sich die Frage ob dem TS ein code der 100ms schneller oder einer der nachvollziehbar geschrieben ist, lieber ist.
über leserlichkeit will ich jetzt hier nicht streiten, aber zu dem effizienzvergleich kann ich nur sagen, das es sich halt nicht um 100ms handelt, sondern um doppelten aufwand und daraus resuliterende halbe geschwindigkeit.
mag sein das das manche leute nicht interessiert, ich würde aber beim schreiben von programmen immer effizienz an erste stelle setzen. und auch wenn du das vielleicht so verstanden hast, ich wollte dich damit ja nicht runter machen... wollte lediglich anmerken, dass das ganze auch deutlich effizienter geht.
gerade bei komplexen aufgaben wie diesen, macht das bei großen mengen an primzahlen schon einen deutlichen unterschied. und wie du schon selbst sagtest, mit diesen 30 primzahlen bekommt man bei weitem nicht alle zahlen aufgeteilt =)
habe die 30 zahlen auch nur aus übernommen. wenn man in das array alle zahlen einfügt, hat man im endeffekt mehrere sekunden geschwindigkeits unterschied.
wie dem auch sei ihr müsst immer für euch wissen, was für euch das wichtigste ist =)
ich persönlich habe keine probleme wenn ich 1sec. mehr warten muss.....
ist bei jedem anders...
mein kleiner couseng hatt grad in der schule mit den primzahlen angefangen und da dachte ich mir, ich versuch mal so ein programm zu schreiben, und es ihm zu schicken,
(darum wollte ich auch soweit wie möglich den lösungsweg mit schreiben lassen..)
aber sowas ist wohl (noch) zu schwer für mich...
darum fand ich jetz | Moep | ´s source "besser", indem sinne, weil ichs da besser sehen konnte, was was sein soll...
weil ich nicht einfach kopieren und abspeichern will, sondern auch lernen wie das gehen soll...
aber nochmal danke an euch. ^^
MfG
€achja.. hab etwas über 600primzahlen hinzugefügt ^^
müsste wohl inetwa reichen..
€achja.. hab etwas über 600primzahlen hinzugefügt ^^
müsste wohl inetwa reichen..
Huh... Is ja nen ganzer Haufen Primzahlen geworden. Wie lange braucht da mein Script für? Ich will jetzt keinen neuen Vergleich antreten, es interresiert mich nur
@lolkop, Kennst du den Spruch "Make It Work Make It Right Make It Fast" von KentBeck. Natürlich ist es von enormen Vorteil bei einer komplexen Berechnung einen leistungsfähigen Algo zur Hand zu haben, das möchte ich nicht Bestreiten. Jedoch stellt sich auch die Frage nch Aufwand und Nutzen. Vielleicht kommt ja der TS irgendwann mal in die Versuchung Zahlen im breich jenseits der 32bit zu berechnen. Dann würde ich ihm auch dringend zu einem anderen algo raten
Btw. wäre in dem Fall nicht ein rekursiver funktionsaufruf der performanteste?! Das Problem bei höheren Zahlen wäre dann wohl nur der überlaufende Stack...
ich hatte vorher natürlich gegooglt bevor ichs hier gefragt habe und hatte aus nen anderen forum nen script gefunden, der "19562" primzahlen in eine .ini abgespeichert und nummeriert hatt... hab dann einfach die ersten 600+ genommen ^^
€um es genauer zu sagen, habe ich 644 primzahlen genommen, weil mehr in eine zeile nicht rein passen und eine fehlermeldung kommt
und die müssten ja wohl erstmal reichen... ^^
LeechTime..
Interresant wie das Problem hier geöst wurde :
Code:
ConsoleWrite( _GetPrimeFactors(123456) & @CRLF)
Func _GetPrimeFactors($n)
Local $F = ObjCreate("System.Collections.ArrayList")
While Mod($n,2) == 0
$F.add(2)
$n = $n/2
WEnd
While Mod($n,3) == 0
$F.add(3)
$n = $n/3
WEnd
Local $t = 5
Local $diff = 2
While $t*$t <= $n
While Mod($n,$t) == 0
$F.add($t)
$n = $n/$t
WEnd
$t = $t + $diff
$diff = 6 - $diff
WEnd
If $n > 1 Then $F.add($n)
Local $out = ''
For $element In $F
$out &= $element & ','
Next
Return StringTrimRight($out, 1)
EndFunc
Hier sieht man wie die Primzahlen z.B. auch generiert werden könnten.
Code:
MsgBox("","",GetPrim(10000))
Func GetPrim($MaxZ, $Delim = ' ')
If ($MaxZ < 2) Then Return 0
If ($MaxZ = 3) Then Return 2
Dim $Flag[$MaxZ + 1], $Prim = 2 & $Delim
For $i = 1 To $MaxZ Step 2
$Flag[$i] = 1
Next
For $i = 3 To $MaxZ Step 2
If ($Flag[$i]) Then
For $e = ($i ^ 2) To $MaxZ Step $i
$Flag[$e] = 0
Next
$Prim &= $i & $Delim
EndIf
Next
Return $Prim
EndFunc ;==>GetPrim
Flyff P-Server "Job's" Frage/Auflistung 11/06/2010 - Flyff Private Server - 28 Replies Hallo liebe Comunity,
Ich wollte mal eine Liste der P-Server Jobs machen und Auflisten welche Programme sie brauchen ich bitte euch das was Frei ist " K.A "zu ergänzen.:
Also im Klartext: Ich wollte wissen Welche Programme die "Arbeiter" eines P-Servers haben z.b Der Mapper braucht BWE (Beast World Editor)
Admin
Programm:Serverfiles/GM-Tool
Aufgabe:Server und alle Accs verwalten & am Anfang serverfiles einrichten
GM
Programm: GM-Tool
Kann mir bitte jemmand eine Hmachi HP erstellen """""SOS HELP"""" 09/15/2010 - Metin2 Private Server - 11 Replies SO wie der Titel schon sagt ich suche einen der mir per Teamviwer eine hp machen kann habe schon alles ausprobiert aber es klappt nie!!!!
PLS HELP...