Zu einer gegebenen Zahl die nächstgrößere oder nächstkleinere
gerade oder ungerade Zahl zu ermitteln, ist nicht ganz so trivial,
wie es auf den ersten Blick erscheinen mag. Die Algorithmen zur
Ermittlung der nächstkleineren oder nächstgrößeren ungeraden
Zahl - egal ob im negativen oder im positiven Zahlenbereich - lassen
sich in jeweils eine einzige Zeile fassen und unterscheiden sich nur
an einer Stelle im Vorzeichen. Die Null gilt hier als gerade Zahl,
da sie ja zwischen den ungeraden Zahlen -1 und 1 liegt. Zur
Ermittlung der nächstkleineren oder nächstgrößeren geraden Zahl
habe ich jedoch keine Formulierungen gefunden, die in einer einzigen
Zeile auch im negativen Zahlenbereich korrekte Ergebnisse liefern.
Meine beiden Funktionen NextEvenBefore und NextEvenAfter
funktionieren zwar wie sie sollen. Wenn Sie dafür effiziente
einzeilige Algorithmen ertüfteln sollten, senden Sie sie mir doch
bitte zu. Ich werde Ihren Vorschlag als Ergänzung zu diesem Artikel
anfügen und Ihnen natürlich die Ehre der Nennung als Autor der
Lösung zuteil werden lassen.
Public Function NextUnevenBefore(ByVal Number As Long) As Long
NextUnevenBefore = Number - (Number And 1) - 1
End Function
Public Function NextUnevenAfter(ByVal Number As Long) As Long
NextUnevenAfter = Number + (Number And 1) + 1
End Function
Public Function NextEvenBefore(ByVal Number As Long) As Long
Dim nNext As Long
nNext = Number + (Number Mod 2) - 2
If Number < 0 Then
nNext = nNext + ((Abs(Number) And 1) * 2)
End If
NextEvenBefore = nNext
End Function
Public Function NextEvenAfter(ByVal Number As Long) As Long
Dim nNext As Long
nNext = Number + ((Number + 1) Mod 2) + 1
If Number < 0 Then
nNext = nNext + (2 - 2 * (Abs(Number) And 1))
End If
NextEvenAfter = nNext
End Function

|