2012-04-30 8 views
1

警告!先のスポイラーズ!プロジェクトオイラー#19

次の情報が表示されますが、 リサーチを自分で行うことをお勧めします。

1月1900は月曜でした。 30日間は9月、 4月、6月、11月です。 残りのすべては31を持っています 2月だけを保存する、 雨が降っているか輝いていますか。 うるう年、29歳。

うるう年は、4で割り切れる年であれば、100で除算することはできませんが、400で割り切れる場合を除きます。20日(1月1日から2000年12月31日) )?

まず、単純な問題のようです。しかし、私が解決策を書いたとき、私は奇妙な問題に遭遇しました。答えは実際には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; 

} 

誰も私のコードに間違いを感じることができますか?

+3

コードを見るだけで、デバッガで1行ずつステップ実行しないでください。ある時点では、その動作は期待どおりに発散しなければなりません。 –

+0

私がしたことは、すべてのデータを調べて、平日がループの最後に一致するかどうかを確認することでした。彼らがやった。それが私を悩ましている。 – wolx

+7

説明をもう一度お読みください。特に「20世紀」の定義。 – Henrik

答えて

9

あなたは1900 i = 1900から開始しています。問題は「1901年1月1日」と言います。