问题19:
您将获得以下信息,但您可能更愿意为自己做一些研究.
1900年1月1日是星期一.
三十天有九月,四月,六月和十一月.
所有其他人都有三十一人,仅拯救二月,其中二十八,风雨无阻.在闰年,二十九岁.
闰年发生在任何一年,可被4整除,但除非可被400整除,否则不会在一个世纪上.
在二十世纪的第一个月(1901年1月1日至2000年12月31日),有多少个星期日下降?
我认为使用PHP可以轻而易举,因为它有很多内置的时间和日期功能.我的代码非常简单,所以我很难看到我在做什么,这是错的.
我的代码:
<?php
echo "<pre>";
$sunday_count = 0;
for( $year = 1901; $year <= 2000; $year++ ) {
for( $month = 1; $month <= 12; $month++ ) {
// Produces a date in format: 1/1/2000
$date = $month . "/1/" . $year;
$time = strtotime( $date );
$is_sunday = ( date( 'l', $time ) == "Sunday" );
echo "$date "
. ( $is_sunday ? 'was a Sunday. ' : '' )
. "<br>";
if( $is_sunday ) $sunday_count++;
}
}
echo "Answer: $sunday_count";
echo "</pre>";
?>
Run Code Online (Sandbox Code Playgroud)
我的代码提出的解决方案是169,这是不正确的.任何的想法?
编辑1
解决方案应该是171.
使用Wolfram Alpha和我的Windows时钟,我加倍检查了我的代码报告的几个星期日.所有人都检查好.
因此,似乎我的代码报告了有效和合法的星期日,但不知何故它错过了其中两个.
编辑2
我对代码中日期的格式进行了以下微小更改:
$date = sprintf('%d-%02d-01', $year, $month); // formats yyyy-mm-dd
Run Code Online (Sandbox Code Playgroud)
然后我使用@ MadaraUchiha的代码生成一个包含171个正确日期的数组.
在将他的约会与我的比较后,这两个错过的日期:
1901-09-01 1901-12-01
编辑3
键盘也显示这些日期不是星期日(但它们确实应该是).
我确信日期被正确地解释为YYYY-MM-DD,因为我的代码提供给解决方案的日期之一是2000-10-01,如果10是月份,那将只是一个星期日,而不是一天.
编辑4
显然,如果在32位系统上,Unix时间戳将无法在该范围之外工作:
Fri, 13 Dec 1901 20:45:54 GMT
Run Code Online (Sandbox Code Playgroud)
至
Tue, 19 Jan 2038 03:14:07 GMT
Run Code Online (Sandbox Code Playgroud)
它可能无法在某些使用时间戳的系统上工作,原因是 32 位系统上 Unix 时间戳的范围是从Fri, 13 Dec 1901 20:45:54 GMT
到Tue, 19 Jan 2038 03:14:07 GMT
,因此您会错过第一年的几乎所有月份。
64 位系统具有更大的整数,这使得范围更大(在 PHP 中)。