1

警告!スポイラーが先!

次の情報が提供されますが、自分で調査することをお勧めします。

1900 年 1 月 1 日は月曜日でした。30 日間には、9 月、4 月、6 月、11 月があります。残りはすべて 31 で、2 月だけを保存します。これには 28 があります。そしてうるう年には、29。

うるう年は 4 で割り切れる年に発生しますが、400 で割り切れない限り、1 世紀には発生しません。

最初は、簡単な問題のように見えます。しかし、解決策をコーディングしていると、奇妙な問題に遭遇しました。実際には、答えは 171 になるはずですが、何をしても 173 になってしまいます。コードを何度も見直しましたが、それでもバグが見つかりません。

#include <iostream>

using namespace std;

int main () {

    int count = 0, days_in_month, days_passed = 1;

    for (int i = 1900; i <= 2000; i++) {
        for (int j = 1; j <= 12; j++) {
            if (j == 4 || j == 6 || j == 9 || j == 11) {
                days_in_month = 30;
            } else if (j == 2) {
                if (i % 400 == 0 || (i % 4 == 0 && i % 100 != 0)) {
                    days_in_month = 29;
                } else {
                    days_in_month = 28;
                }
            } else {
                days_in_month = 31;
            }
            if (days_passed % 7 == 0) {
                count++;
            }
            days_passed += days_in_month;
        }
    }

    cout << count << endl;

    cin.ignore();
    return 0;

}

誰かが私のコードに何か問題があることに気付くことができますか?

4

1 に答える 1

10

あなたは1900年から始めていi = 1900ます。問題には「1901 年 1 月 1 日」と書かれています。

于 2012-04-30T11:02:15.517 に答える