8

问题 19:

您将获得以下信息,但您可能更愿意自己做一些研究。

1900 年 1 月 1 日是星期一。

三十天有九月、四月、六月和十一月。

其余的都有三十一个,仅保存二月,它有二十八,风雨无阻。在闰年,二十九。

闰年出现在任何能被 4 整除的年份,但不会出现在世纪,除非它能被 400 整除。

在 20 世纪(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>";
?>

我的代码提出的解决方案是 169,这是不正确的。任何的想法?

编辑 1

解应该是 171。

使用 Wolfram Alpha 和我的 Windows 时钟,我双重检查了我的代码报告的几个星期天。他们都检查好了。

所以看起来我的代码报告了有效和合法的星期天,但不知何故它错过了其中两个。

编辑 2

我对代码中日期的格式进行了以下细微更改:

$date = sprintf('%d-%02d-01', $year, $month); // formats yyyy-mm-dd

然后我使用@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

Tue, 19 Jan 2038 03:14:07 GMT
4

3 回答 3

4

它可能无法在某些使用时间戳的系统上运行的原因是 32 位系统上的 Unix 时间戳的范围是 fromFri, 13 Dec 1901 20:45:54 GMTTue, 19 Jan 2038 03:14:07 GMT,因此您几乎错过了第一年的所有月份。

64 位系统具有更大的整数,这使得范围更大(在 PHP 中)。

于 2012-11-07T05:34:52.687 回答
2

使用 DateTime 对象,我用这个(更短,更易读)的代码得到 171:

header("Content-type: text/plain"); //Browser display

$time = new DateTime("1901-01-01");
$end = new DateTime("2000-12-31");

$counter = 0;

while (!$time->diff($end)->invert) { //$time isn't greater than $end
    $time->modify("+1 month");
    if ($time->format("l") == "Sunday") {
        $counter++;
        echo $time->format("Y-m-d") . " was a Sunday!\n";
    }
}

echo "\nTotal number of Sundays: $counter";

使用 DateTime 对象时,您将日期视为Dates而不是numbersstrings。与任何其他方法相比,这为您提供了巨大的灵活性优势。

于 2012-11-06T22:39:47.430 回答
0

这段代码的问题是行

$date = $month . "/1/" . $year;

这应该是

$date = "1/".$month."/" . $year;

你混合了月份和日期的位置。

于 2015-03-07T09:43:38.620 回答