Nein - leider dauert das ganze wieder viel länger
Beiträge von ProgrammingDonkey
-
-
Danke für die Hilfe, dieses Problem hatte ich allerdings schon beseitigt. Das ganze dauerte dann aber viel länger.. Morgen Nachmittag kann ich deine Verbesserung testen, ich hoffe, dass mein neues Problem dort nicht auftritt
-
1-20 = 8 Primzahlen, und die stimmen auch noch alle
Spoiler anzeigen
2
3
5
7
11
13
17
19
EDIT: Aber bei 30 schleicht sich die 25 ein. Mal sehen -
Neues Script:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Const $iMax = 1000000
$hTimer = TimerInit()
$aPrimes = GetPrimes($iMax)
ConsoleWrite(@CRLF&"Time >> "&round(TimerDiff($hTimer)/1000, 4)&@CRLF)
_ArrayDisplay($aPrimes)Func GetPrimes(Const $iHead)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $aPrimes[round($iHead/2-1, 0)]
$iResult = round($iHead/2-1, 0)
$x = 0
for $i = 3 to $iHead step +2
$aPrimes[$x] = $i
$x += 1
Next
$Stop = False
for $x = 0 to UBound($aPrimes)-1 step +1
$iNumber = $aPrimes[$x]
If $x > UBound($aPrimes)-1 or $Stop Then
ConsoleWrite("Last one: "&$iNumber&@CRLF)
ExitLoop
EndIf
$Stop = True;Local $hTimer = TimerInit()
[/autoit]
for $iNum = $x+1 to UBound($aPrimes)-1
If $aPrimes[$iNum] = -1 Then ExitLoop
If Mod($aPrimes[$iNum], $iNumber) = 0 Then
$Stop = False
;ConsoleWrite("Delete: "&$aPrimes[$iNum]&@CRLF)
$aPrimes[$iNum] = -1
$iResult -= 1
EndIf
Next
;ConsoleWrite($iNumber&" / "&UBound($aPrimes)-1&" Time: "&TimerDiff($hTimer)&@CRLF)
Next
Local $aResult[$iResult+1]
$x = 0
$aResult[0] = 2
for $i = 1 to $iResult
While $aPrimes[$x] = -1
$x += 1
WEnd
$aResult[$i] = $aPrimes[$x]
$x += 1
Next
ConsoleWrite($iResult +1 &" Primes found."&@CRLF)
Return $aResult
EndFunc
Stimmen die Primzahlen? Sind es 333334 bis eine Mio? -
@Make-Grafik >> Mein Script macht genau das gleiche, nur das die Zahlen Liste nur aus ungeraden besteht. Erklärende Kommentare bräuchte dein Script btw auch ^^.
An die anderen >> Danke für die schnelle Hilfe, ich versuche es gleich auch ohne _ArrayDelete in der Schleife.
@Kanashius >> Das ConsoleWrite() macht zeittechnisch keinen Unterschied (habe ich getestet), deshalb habe ich es zur Darstellung drin gelassen -
Ich habe mich nun an die gleiche Technik angelehnt, wie @Make-Grafik, allerdings funktioniert das ganze nur sehr langsam:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Const $iMax = 3000
$hTimer = TimerInit()
$aPrimes = GetPrimes($iMax)
ConsoleWrite(@CRLF&"Time >> "&round(TimerDiff($hTimer)/1000, 4)&@CRLF)
_ArrayDisplay($aPrimes)Func GetPrimes(Const $iHead)
[/autoit]
Local $aPrimes[round($iHead/2-1, 0)]
$x = 0
for $i = 3 to $iHead step +2
$aPrimes[$x] = $i
$x += 1
Next
$Stop = False
for $x = 0 to UBound($aPrimes)-1 step +1
If $x > UBound($aPrimes)-1 or $Stop Then
ConsoleWrite("Last one: "&$iNumber&@CRLF)
ExitLoop
EndIf
$Stop = True
$iNumber = $aPrimes[$x]
Local $hTimer = TimerInit()
for $iNum = UBound($aPrimes)-1 to $x+1 step -1
If Mod($aPrimes[$iNum], $iNumber) = 0 Then
$Stop = False
ConsoleWrite("Delete: "&$aPrimes[$iNum]&@CRLF)
_ArrayDelete($aPrimes, $iNum)
EndIf
Next
ConsoleWrite($iNumber&" / "&UBound($aPrimes)-1&" Time: "&TimerDiff($hTimer)&@CRLF)
Next
Return $aPrimes
EndFunc
Wie kann ich da (viel) mehr Zeit sparen? -
@Raupi >> Danke, gut zu wissen
-
Und eigentlich auch das zweite "="?
Das braucht man bei C++, Python usw. Aber bei AutoIt genügt ein "=".. -
Sorry für die Leichenschänderei, aber der Link ist down, und ich würde dein Programm gerne testen..
-
Sehr schönes und verständliches Tutorial
Alles gut zusammengefasst und erklärt - Und mir hat es sehr geholfen, da ich nun keine eckigen Kreise mehr habe
Danke -
@Tweaky >> Ich hätte vor einem Blick in die Hilfe gedacht, dass man die Funktion an andere Fenster anbinden kann vonwegen:
[autoit]GUIRegisterMsg($hMsg, $sFunc [, $hWnd])
[/autoit]
Leider geht das nicht.
@Kanashius >> Der explorer ist ja bekanntlich immer offen. Und mit ihm kommt auch immer ein Fenster; "Program Manager" heißt es glaube ich. Darauf kann man auch zugreifen, aber als normaler Windows Nutzer nicht schließen (Normal = Man lässt das System in Ruhe, und verwendet kein WinClose("Program Manager") ) -
Ich meine irgendwo mal eine _WinAPI_Funktion für sowas gesehen zu haben - aber prüfe doch malmal, ob du GUIRegister(..) auf fremde GUIs anwenden kannst, dann könnte man das auf das Fenster vom explorer.exe packen.
-
Du kannst zur Not aber auch ein GUI erstellen, ohne es anzuzeigen. Das ist zwar etwas "umständlich", ich wüsste aber nicht, was dagegen spricht.
-
-
Was ich meinte, ist dass man den Bereich, in den man mit der Maus geht, um die Uhr anzuzeigen, verkleinern sollte.
z.B. auf die Mitte (man könnte dort auch dauerhaft einen kleinen halb transparenten Strich/GUI anzeigen lassen, damit man den Bereich sieht.) -
Sehr schick, ich würde allerdings den Maus-Bereich verkleinern.
[autoit]
Aber um das zutun fehlen mir die Kentnisse; Was passiert in folgender Zeile, und wo für stehen die Fragezeichen und Doppelpunkte?:
[/autoit]
$iOffset = $aPos[1] = 0 ? $iOffset / 1.5 : ($iOffset + 1) * 1.5 > $iH ? $iH : ($iOffset + 1) * 1.5 -
https://www.autoitscript.com/autoit3/docs/f…PixelSearch.htm
"Searches a rectangle of pixels for the pixel color provided."
~ Sucht in einem Viereck von Pixeln nach dem Pixel mit der angegebenen Farbe ~ -
@chesstiger >> Meine andere Frage war im Thread verrutscht; Ich hatte noch den "primzahlenrechner"-Thread offen, und dachte, ich wäre dort noch drauf
Jedenfalls habe ich meine Frage hier gelöscht -
Gut zu wissen
[autoit]
Gibt es eine Möglichkeit, an der Stelle Parameter für die Funktion hinzuzufügen?
Nach dem MottoRegister("Funktion /Param1 /Param2")
[/autoit]
Oder so? -
Genial
Allerdings verstehe ich deinen Code nicht ganz, und bitte dich darum mal eine Erklärung dazu zu verfassen
Und noch eine Idee:Spoiler anzeigen
Eine nicht-Primzahl ist doch zwangshaft durch eine Primzahl teilbar, oder?
Dann hätte ich da noch eine Idee:Spoiler anzeigen
[autoit#include <Array.au3> $hTimer = TimerInit() Global Const $iMax = 100000 $aResult = GetPrimes($iMax) MsgBox(0,"Done","Passed time:"&@TAB&Round(TimerDiff($hTimer)/1000, 4)) _ArrayDisplay($aResult) Func GetPrimes($iHead) $aPrimes[1] = [2] $bContinue = True For $iNumber = 3 to $iHead step +2 For $iElement in $aPrimes If $iElement > sqrt($iNumber) Then ExitLoop EndIf If Mod($iNumber, $iElement) = 0 Then $bContinue = False ExitLoop EndIf Next If not $bContinue Then $bContinue = True Else _ArrayAdd($aPrimes, $iNumber) EndIf Next Return $aPrimes EndFunc[/autoit]
Ist zwar leider sehr langsam, aber daran arbeite ich noch; Wäre jedenfalls auch ein Ansatz.