Seite 1 von 4
Gerade oder ungerade Zahlen feststellen
Verfasst: 04.12.2006 18:41
von AND51
Hallo!
Hier mein Code aus dem englischen Forum. Beide Macros prüfen, ob die Zahl gerade oder ungerade ist. Für unbedarfte: "even" heißt "gerade", "odd" heißt ungerade". Der Code dürfte eigentlich für jedermann verständlich sein:
Code: Alles auswählen
Macro isOdd(number)
(number % 2 And 1)
EndMacro
Macro isEven(number)
(number % 2 XOr 1)
EndMacro
;- Testing
Debug isOdd(23)
Debug isOdd(24)
Debug isEven(23)
Debug isEven(24)
Link zum englischen Forumsthread: [
http://www.purebasic.fr/english/viewtop ... ight=AND51]
Verfasst: 04.12.2006 18:46
von Kaeru Gaman
da genügt auch
den modulo kann man sich sparen

Verfasst: 04.12.2006 19:00
von AND51
Code upgedatet, zweite isEven()-Variante hinzugefügt:
Code: Alles auswählen
Macro isOdd(number)
(number & 1)
EndMacro
Macro isEven(number)
(number % 2 XOr 1)
EndMacro
Macro isEven_2(number)
(Not (number % 2))
EndMacro
;- Testing
Debug isOdd(23)
Debug isOdd(24)
Debug isEven(23)
Debug isEven(24)
Debug isEven_2(23)
Debug isEven_2(24)
- Added isEven_2(), which is working without "XOr 1"
Leaving out "And 1" in isOdd()
Changed isOdd(), now working bitwise instead of using modulo (thx2kaeruGaman)
Verfasst: 04.12.2006 19:01
von AND51
Kaeru Gaman hat geschrieben:da genügt auch
den modulo kann man sich sparen

falsch gedacht!Bei dir kommt (fast) immer 1 raus:
Verfasst: 04.12.2006 19:12
von Kaeru Gaman
yo.. verschrieben
ist es.
bitwise, nich logical..
Code: Alles auswählen
For number=0 To 33
A$ = Str(number) + " - " + Str(number & 1)
Debug A$
Next
Verfasst: 04.12.2006 19:51
von Alves
Hey kennt wer Beutelspacher? Den coolsten Mann aus der BDW?
Ich hab sachon lange nach einer Funktuion geuscht, um herauszufinden, ob eine Zahl gerade ist, oder nicht. Damit kann ich endlich ein Projekt vollenden!
Edit: Ich hab den Code jetzt fertig, wer ihn haben will, kann ihn haben, das war mal eine Formel von beutelspacher vorgestellt.
Beispiel
Code: Alles auswählen
#file=1
Macro isEven(number)
(Not (number % 2))
EndMacro
Macro isOdd(number)
(number & 1)
EndMacro
datei$ = SaveFileRequester("3n+1 Speicherdatei festlegen","","log | *.log",0) + ".log"
zahl$ = InputRequester("3n+1", "Startzahl eingeben", "")
zahl = Val(zahl$)
CreateFile(#file,datei$)
WriteStringN(#file,Str(zahl))
Repeat
If iseven(zahl)
zahl = zahl/2
;WriteStringN(#file,Str(zahl))
ElseIf isodd(zahl)
zahl = zahl*3+1
;WriteStringN(#file,Str(zahl))
EndIf
WriteStringN(#file,Str(zahl))
Until zahl = 1
CloseFile(#file)
RunProgram(datei$)
Verfasst: 04.12.2006 20:04
von Froggerprogger
AND bzw. XOR ist hier aber falsch!
Stattdessen muss & und ! genommen werden, da es hier um Bitoperationen, und nicht logische geht (wie Kaeru schon meinte), also:
Code: Alles auswählen
Macro isOdd(number)
number & 1
EndMacro
Macro isEven(number)
(number & 1) ! 1
EndMacro
For i=-15 To 15
Debug i
Debug isOdd(i)
Debug isEven(i)
Next
Verfasst: 04.12.2006 20:40
von remi_meier
und warum immer so kompliziert mit Bitoperationen, wenn es doch auch
ganz logisch und einfach so geht?
Code: Alles auswählen
Macro isOdd(number)
((number) % 2)
EndMacro
Macro isEven(number)
(1 - (number) % 2)
EndMacro
;- Testing
Debug isOdd(23)
Debug isOdd(24)
Debug isEven(23)
Debug isEven(24)
Verfasst: 04.12.2006 20:47
von #NULL
ich würde da gar nicht erst ein macro nehmen. ist ja nicht mal kürzer.
Debug 23%2
Debug 24%2
Debug (Not 23%2)
Debug (Not 24%2)
Verfasst: 04.12.2006 23:20
von remi_meier
btw, im Moment darf man "Not" noch nicht so benutzen, darf nur für
Bedingungen genutzt werden!
Und ich finde, Leserlichkeit ist an manchen Orten doch recht wichtig. In
komplexen Formeln könnte ein isOdd() aussagekräftiger sein als ein
Operatorengewirr.