Project Euler #19をやっています。月ごとにループして高校のモジュラー演算を適用したいだけなら、それは明らかに些細な問題ですが、私は楽しみのために別のアプローチを試しています。
1901 年 1 月 / 2 月 1 日も 2001 年 1 月 / 2 月 1 日も日曜日ではないことに注意してください。したがって、暦年は 3 月 1 日から始まると見なすことができます。 365 は合同 1 (mod 7) であるため、特定の年の Xdays の数は繰り返しシーケンス {2,2,2,1,2,1,2} です。したがって、うるう年を因数分解すると、シーケンス内で 2 つの要素がジャンプします。だから私は問題を完了するためにこのコードを書きました:
const unsigned s[7] = {2,2,2,1,2,1,2};
unsigned n = 0;
unsigned y = 1901;
unsigned c = 0;
do {
c=c%7;
n+=s[c];
++y;
c += ((y%4!=0)||(y%400==0) ? 1 : 2);
} while (y<2001);
std::cout << n << std::endl;
しかし、私は答えが171であるところで172を得ています。
注: 1200/7 コメントを残さないでください。
修正済み: に置き換えc += ((y%400==0)||((y%4==0)&&(y%100!=0)) ? 2 : 1);