erstellt 08.03.18; übersetzt 30.06.25;


Kapitel 36 Programmieraufgabens

Aufgabe 1 — Odious Zahlen

Eine odious Zahl ist eine nichtnegative ganze Zahl, die eine ungerade Anzahl von 1en in ihrer binären Darstellung hat. Die ersten paar odious Zahlen sind 1, 2, 4, 7, 8, 11, 13, 14, 16, 19, ... Zahlen, die nicht odious sind, werden als evil Zahlen bezeichnet.

Hinweis: Odious = Odd (ungerade), Evil = Even (gerade)

Um die Bits in der Binärdarstellung einer ganzen Zahl zu erhalten, muss der Rest nach der Division durch zwei ermittelt und dann durch zwei geteilt werden. Das tun wir bis die Division eine Null ergibt. Beachtet, dass die Bits in der Reihenfolge von rechts nach links ausgegeben werden. Die Binärdarstellung von 11 ist zum Beispiel 1011

11 % 2 = 1  11 / 2 = 5
 5 % 2 = 1   5 / 2 = 2
 2 % 2 = 0   2 / 2 = 1
 1 % 2 = 1   1 / 2 = 0

Wir schreiben ein Programm, das den Benutzer wiederholt nach einer nichtnegativen ganzen Zahl fragt und dann sagt, ob sie odious oder evil ist. Das Programm endet, wenn der Benutzer eine negative ganze Zahl eingibt. Wir verwenden eine static Methode, die feststellt, ob ihr long Parameter odious ist und true oder false zurückgibt. Die main() Methode wird fast identisch mit dem FactorialTester Programm in diesem Kapitel sein.

Weisstein, Eric W. "Odious Number." From MathWorld. http://mathworld.wolfram.com/OdiousNumber.html

Zurück zum Inhaltsverzeichnis.


Aufgabe 2 — Unlucky Numbers Unglückszahlen

Eine Unglückszahl ist eine nichtnegative ganze Zahl, deren Dezimaldarstellung nacheinander die Ziffern 1 und 3 enthält.

    13 is unlucky
   513 is unlucky
  1307 is unlucky
813015 is unlucky
134130 is unlucky

  103 is safe
   31 is safe
41237 is safe

Um die Ziffern in der Dezimaldarstellung einer ganzen Zahl zu erhalten, muss der Rest nach der Division durch zehn ermittelt und dann durch zehn geteilt werden. Wir tun das, bis die Division eine Null ergibt. Beachtet, dass die Ziffern in der Reihenfolge von rechts nach links herauskommen.

1307 % 10 = 7     1307 / 10 = 130
 130 % 10 = 0      130 / 10 = 13
  13 % 10 = 3       13 / 10 = 1
   1 % 10 = 1        1 / 10 = 0

Wir schreiben ein Programm, das den Benutzer wiederholt nach einer nichtnegativen ganzen Zahl fragt und dann sagt, ob diese unglücklich (unlucky) oder safe (sicher) ist. Das Programm endet, wenn der Benutzer eine negative ganze Zahl eingibt. Wir verwenden eine static Methode, die feststellt, ob ihr long Parameter unlucky ist und true oder false zurückgibt. Die main() Methode wird fast identisch mit dem FactorialTester Programm in diesem Kapitel sein.

Eine andere Möglichkeit festzustellen, ob eine ganze Zahl unlucky ist, besteht darin, sie in einen String umzuwandeln und dann die Zeichen des Strings von links nach rechts auf die Sequenz "13" zu untersuchen. (Oder verwendet eine String Methode.) Das ist jedoch viel langsamer als die obige Methode.

Zurück zum Inhaltsverzeichnis.


Aufgabe 3 — Unlucky Evil Numbers

Wir schreiben ein Programm, das feststellt, ob eine Unglückszahl auch evil ist. Dazu schreiben wir ein main() Programm, das eine Zählschleife von eins bis zu einer bestimmten Obergrenze enthält. Wir testen jeden Schleifenzähler, ob er unlucky ist und wenn ja, ob er evil ist. Dazu verwenden wir die static Funktionen, die wir für die beiden obigen Aufgaben geschrieben haben.

Zurück zum Inhaltsverzeichnis.


Aufgabe 4 — Perfekte Zahlen

Eine perfekte Zahl ist eine positive ganze Zahl, deren geeignete Teiler sich zur ganzen Zahl selbst addieren. Ein echter Teiler von N ist eine positive ganze Zahl kleiner als N, die N ohne Rest teilt. Zum Beispiel ist 3 ein echter Teiler von 6, weil 3 die Zahl 6 ohne Rest teilt. 1 ist ein echter Teiler aller positiven ganzen Zahlen.

6 ist eine vollkommene Zahl, weil ihre echten Teiler 1, 2 und 3 sind und 1+2+3 = 6.

12 ist keine vollkommene Zahl, weil ihre echten Teiler 1, 2, 3, 4, 6 sind und 1+2+3+4+6 = 16

Wir schreiben ein Programm, das alle perfekten Zahlen findet, die kleiner sind als eine vom Benutzer eingegebene Obergrenze. Wir verwenden eine static Methode, die prüft, ob ihr Parameter perfekt ist und true oder false zurückgibt.

Zurück zum Inhaltsverzeichnis.


Aufgabe 5 — Fakultät mit Error Flag

Die Fakultätsberechnung, wie sie in diesem Kapitel beschrieben ist, erreicht leicht einen Überlauf, gibt aber keinen Hinweis darauf, wann dies geschieht. Wir wissen aber (aus Tests), dass es zum Überlauf kommt, wenn der Parameter 21 oder mehr ist. Manchmal ist das Ergebnis des Überlaufs negativ und manchmal positiv. Außerdem ist die Fakultät für eine negative ganze Zahl nicht definiert.

Wir ändern die factorial() Methode so, dass sie sofort -1 zurückgibt, wenn der Parameter kleiner als Null oder größer als 20 ist. Ändern dann die main() Methode, um das Ergebnis zu testen und eine Fehlermeldung auszugeben, wenn das Ergebnis negativ ist.

Ein eleganterer Weg Fehler zu melden, ist die Verwendung von Exceptions. Aber das ist ein Thema für ein späteres Kapitel.

Zurück zum Inhaltsverzeichnis.


Ende der Aufgaben