Gerade oder ungerade Zahlen feststellen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Gerade oder ungerade Zahlen feststellen

Beitrag 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]
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

da genügt auch

Code: Alles auswählen

(number And 1)
den modulo kann man sich sparen ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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)
Zuletzt geändert von AND51 am 04.12.2006 19:16, insgesamt 2-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Kaeru Gaman hat geschrieben:da genügt auch

Code: Alles auswählen

(number And 1)
den modulo kann man sich sparen ;)
falsch gedacht!Bei dir kommt (fast) immer 1 raus:

Code: Alles auswählen

For number=0 To 33
	Debug (number And 1)
Next
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo.. verschrieben

Code: Alles auswählen

(number & 1)
ist es.
bitwise, nich logical..

Code: Alles auswählen

For number=0 To 33 
   A$ = Str(number) + " - " + Str(number & 1)
   Debug A$
Next
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag 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$)     
    
Zuletzt geändert von Alves am 04.12.2006 20:07, insgesamt 1-mal geändert.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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
!UD2
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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)
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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.
Antworten