Problem 19:
Sie erhalten die folgenden Informationen, aber Sie möchten vielleicht etwas tun forschen Sie selbst.
1. Januar 1900 war ein Montag.
Dreißig Tage sind September, April, Juni und November.
Alle anderen haben einunddreißig, Saving Februar alone, Which hat achtundzwanzig, Regen oder Sonnenschein. Und in Schaltjahren, neunundzwanzig.
Ein Schaltjahr tritt in jedem Jahr auf, das durch 4 teilbar ist, aber nicht auf a Jahrhundert, es sei denn, es ist durch 400 teilbar.
Wie viele Sonntage fielen am ersten des Monats während des zwanzigsten Jahrhunderts (1. Januar 1901 bis 31. Dezember 2000)?
Ich dachte, dass die Verwendung von PHP hierfür ein Kinderspiel wäre, da es so viele eingebaute Zeit- und Datumsfunktionen hat. Mein Code ist wirklich ziemlich einfach, so dass es mir schwer fällt zu sehen, was ich mache, ist falsch.
Mein Code:
%Vor%Die Lösung, die mein Code enthält, ist 169, was nicht korrekt ist. Irgendeine Idee?
Bearbeiten 1
Die Lösung soll 171 sein.
Mit Wolfram Alpha und meiner Windows-Uhr habe ich einige der Sonntage verdoppelt, die mein Code meldet. Alle sind OK.
So scheint es, dass mein Code gültige und legitime Sonntage meldet, aber irgendwie hat er zwei von ihnen verpasst.
Bearbeiten 2
Ich habe die folgende kleine Änderung an der Formatierung des Datums in meinem Code vorgenommen:
%Vor%Ich habe dann @ MadaraUchias Code verwendet, um ein Array mit den 171 korrekten Daten zu generieren.
Nachdem ich seine Daten mit meinen verglichen habe, sind dies die zwei verpassten Daten:
1901-09-01 1901-12-01
Bearbeiten Sie 3
Codepad zeigt auch , dass diese Daten keine Sonntage sind (aber sie sollten es wirklich sein).
Und ich bin mir sicher, dass die Daten korrekt als JJJJ-MM-TT interpretiert werden, weil eines der Daten, die mein Code der Lösung bietet, 2000-10-01 ist, was nur ein Sonntag wäre, wenn 10 der Monat ist. nicht der Tag.
Bearbeiten 4
Wenn also auf einem 32-Bit-System Unix-Zeitstempel außerhalb des Bereichs nicht funktionieren:
%Vor%bis
%Vor% Der Grund, warum es bei einigen Systemen, die Zeitstempel verwenden, nicht funktioniert, ist, dass der Bereich eines Unix-Zeitstempels auf 32-Bit-Systemen von Fri, 13 Dec 1901 20:45:54 GMT
bis Tue, 19 Jan 2038 03:14:07 GMT
reicht, sodass Sie fast alle Monate im ersten Jahr verpassen.
64-Bit-Systeme haben größere Ganzzahlen, wodurch der Bereich größer wird (in PHP).
Ich erhalte 171 mit diesem (viel kürzeren und besser lesbaren) Code, der DateTime-Objekte verwendet:
%Vor%Wenn Sie DateTime-Objekte verwenden, behandeln Sie Daten als Daten und nicht als Zahlen oder Zeichenfolgen . Dies gibt Ihnen einen großen Flexibilitätsvorteil gegenüber anderen Ansätzen.
Tags und Links php