Leap Year
Du erhältst ein Jahr year des gregorianischen Kalenders. Gib true zurück, wenn es ein Schaltjahr ist, also ein Jahr mit einem 29. Februar, und andernfalls false.
Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, außer bei Jahren, die durch 100 teilbar sind. Diese sind keine Schaltjahre, es sei denn, sie sind auch durch 400 teilbar.
Funktion
- yearinteger
- das zu überprüfende Jahr
- Gibt zurückboolean
- true, wenn das Jahr einen 29. Februar hat, andernfalls false
Einschränkungen
1 ≤ year ≤ 106
Beispiele
- Eingabe
- year = 2024
- Ausgabe
- true
- Erklärung
2024ist durch4teilbar und kein Jahrhundertjahr, also ist es ein Schaltjahr.
- Eingabe
- year = 1900
- Ausgabe
- false
- Erklärung
1900ist durch4teilbar, aber auch durch100und nicht durch400, daher gilt die Jahrhundertausnahme und es ist kein Schaltjahr.
- Eingabe
- year = 2000
- Ausgabe
- true
- Erklärung
2000ist durch100teilbar, was dagegen sprechen würde, aber es ist auch durch400teilbar, wodurch es wieder infrage kommt. Es ist ein Schaltjahr.
+16 versteckte Tests beim Einreichen
Tipps
Öffne sie nacheinander. Jeder verrät ein bisschen mehr.
Ein Rest von
0nach der Division durch4ist die erste Regel. Welche Jahre verstoßen dagegen?Jahrhundertjahre durchbrechen sie, und Vielfache von
400durchbrechen wiederum die Jahrhundertregel. Jedes Vielfache von400ist auch ein Vielfaches von100und von4, daher entscheidet die Reihenfolge deiner Prüfungen über die Antwort.Prüfe zuerst die Teilbarkeit durch
400, dann durch100, dann durch4, und lass die erste zutreffende Regel entscheiden. Oder fasse sie zusammen: durch 4 teilbar und nicht durch 100, oder durch 400 teilbar.
Lösung
Jede Regel benötigt nur einen Rest, daher besteht die Arbeit aus drei Teilbarkeitstests. Die Falle liegt in der Reihenfolge: Bei Jahren wie 2000, die ein Jahrhundert und zugleich ein Vielfaches von 400 sind, widersprechen sich die Regeln. Prüfe entweder zuerst die spezifischste Regel oder schreibe die Regel als einen Ausdruck, dessen Klammern die Ausnahmen an der richtigen Stelle halten.
Prüfe die Regeln von der spezifischsten bis zur allgemeinsten
Idee
Die drei Regeln bilden eine Kette von Ausnahmen. Teilbar durch 4 macht ein Jahr zum Schaltjahr, teilbar durch 100 macht das rückgängig, und teilbar durch 400 macht diese Rückgängigmachung rückgängig. Ein Jahr, auf das eine spätere Regel zutrifft, erfüllt immer auch die früheren: Jedes Vielfache von 400 ist ein Vielfaches von 100, und jedes Vielfache von 100 ist ein Vielfaches von 4.
Also entscheidet die spezifischste zutreffende Regel über die Antwort. Prüfe zuerst 400, dann 100, dann 4, und gib das Ergebnis zurück, sobald eine Regel zutrifft. Für 2000 lautet das Ergebnis bereits beim ersten Test ja. Für 1900 schlägt der erste Test fehl, und der zweite ergibt nein. Für 2024 schlagen die ersten beiden Tests fehl, und der dritte ergibt ja.
Trifft keine der drei Regeln zu, ist das Jahr überhaupt nicht durch 4 teilbar und daher ein gewöhnliches Jahr.
Algorithmus
- Wenn
year % 400 == 0, gibtruezurück. - Wenn
year % 100 == 0, gibfalsezurück. - Wenn
year % 4 == 0, gibtruezurück. - Andernfalls gib
falsezurück.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseEin boolescher Ausdruck
Idee
Lies die Regel als zwei Möglichkeiten, ein Schaltjahr zu sein. Entweder ist das Jahr durch 4 teilbar und kein Jahrhundertjahr, oder es ist durch 400 teilbar. Dieser Satz lässt sich Wort für Wort in (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 übersetzen.
Prüfe die Regel anhand der drei Beispiele. 2024 erfüllt die erste Hälfte. 1900 erfüllt die erste Hälfte nicht, weil es ein Jahrhundertjahr ist, und die zweite Hälfte ebenfalls nicht, weil 1900 % 400 gleich 300 ist. 2000 erfüllt aus demselben Grund wie 1900 die erste Hälfte nicht und die zweite Hälfte.
Du kannst den Ausdruck auch anders gruppieren: durch 4 teilbar und entweder kein Jahrhundertjahr oder ein Vielfaches von 400. Beide Formen liefern für jedes Jahr dasselbe Ergebnis. Der Ausdruck führt höchstens dieselben drei Prüfungen wie die if-Kette aus.
Algorithmus
- Berechne
year % 4 == 0 and year % 100 != 0: durch 4 teilbar und kein Jahrhundertjahr. - Berechne
year % 400 == 0. - Gib
truezurück, wenn eine der beiden Bedingungen erfüllt ist.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Stolperfallen und Grenzfälle
Jeder Fehler hier entsteht dadurch, dass die Regel als ein einziger Test statt als Kette von Ausnahmen behandelt wird.
- Nur
year % 4 == 0prüfen. Das liefert für jedes Jahr von1901bis2099die richtige Antwort. Deshalb bleibt der Fehler unentdeckt. Für1900und2100ist die Antwort jedoch falsch. 100vor400in einer if-Kette testen. Der Jahrhunderttest gibt für2000falsezurück, bevor der400-Test überhaupt ausgeführt wird.- Den durch 4 teilbar-Teil weglassen.
year % 100 != 0 or year % 400 == 0stuft2023als Schaltjahr ein, weil2023kein Jahrhundertjahr ist. year / 4verwenden, obwohl der Rest gemeint ist. Die Division zeigt, wie oft4hineinpasst; der Rest zeigt, ob es genau aufgeht.
Häufige Fragen4
Was ist die Regel für ein Schaltjahr?
Ein gregorianisches Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, außer wenn es durch 100 teilbar ist. Ein durch 400 teilbares Jahr ist trotzdem ein Schaltjahr. Daher sind 2024 und 2000 Schaltjahre, während 1900 und 2100 keine sind.
Warum ist 1900 kein Schaltjahr, 2000 aber schon?
Beide sind Jahrhundertjahre und durch 100 teilbar, wodurch ein Jahr normalerweise ausgeschlossen wird. 2000 ist auch durch 400 teilbar, und diese Regel hat Vorrang vor der Jahrhundertregel. Bei der Division durch 400 bleibt bei 1900 ein Rest von 300, daher bleibt es ein gewöhnliches Jahr.
Warum gibt es die Jahrhundertregeln?
Ein Sonnenjahr dauert etwa 365.2422 Tage. Ein zusätzlicher Tag alle 4 Jahre ergibt einen Durchschnitt von 365.25, was etwa 3 Tage zu viel alle 400 Jahre sind. Wenn in 3 von 4 Jahrhundertjahren der Schalttag ausgelassen wird, werden diese 3 Tage ausgeglichen. Der Durchschnitt beträgt dann 365.2425 Tage – genau genug, um den Kalender Tausende von Jahren mit den Jahreszeiten im Einklang zu halten.
Wie hoch ist die Zeitkomplexität beim Prüfen, ob ein Jahr ein Schaltjahr ist?
Der Zeit- und Speicheraufwand beträgt O(1). Die Prüfung umfasst höchstens drei Restoperationen und einige Vergleiche, unabhängig von der Größe des Jahres.
Ähnliche Aufgaben
Aufgaben mit denselben Ideen. Wer zwei oder drei davon löst, behält das Muster.
Python
def isLeapYear(year):
# Schreibe hier CodeFall 1
Fall 2
Fall 3
Eingabe
year = 2024
Erwartet
true