erstellt 08.03.18; übersetzt 30.06.25;
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.
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.
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.
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.
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