-1

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);

4

1 に答える 1

1

edit : うるう年のルールについて。

うるう年の規則には、もう 1 つだけ特殊なケースがあります。

次の場合、その年は閏年です。

  • 4で割り切れる
    • でも100で割り切れない
      • 400でも割り切れる場合を除く

メートル法カレンダーがあればいいのにと思うことがあります。メガ秒とキロ秒、誰か?


うるう年のルールについて少し混乱したのではないでしょうか。

あなたのリンクから:

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

つまり、400で割り切れる年閏年です。コード内の条件が逆になっています。

于 2013-02-02T22:27:34.497 に答える