-1

我正在做Project Euler #19。如果您只想逐月循环并应用一些高中模运算,这显然是一个微不足道的问题,但我正在尝试一种不同的方法只是为了好玩。

我注意到 1901 年 1 月/2 月 1 日不是星期日,2001 年 1 月/2 月 1 日也不是,因此我可以将我的日历年视为从 3 月 1 日开始。使用基本的模运算,很容易看出如果闰年不存在,那么给定年份中的 X 天数是重复序列 {2,2,2,1,2,1,2},因为 365 等于 1(模 7)。因此,考虑闰年会导致序列中出现 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;

但是我得到 172,答案是 171。有人知道我哪里出错了吗?

注意:请不要留下 1200/7 评​​论。

固定:替换为c += ((y%400==0)||((y%4==0)&&(y%100!=0)) ? 2 : 1);

4

1 回答 1

1

编辑:关于闰年规则。

闰年规则还有一种特殊情况。

一年是闰年,如果它是:

  • 可被四除
    • 但不能被 100 整除
      • 除非它也能被 400 整除

有时我希望我们有公制日历。兆秒和千秒,有人知道吗?


也许你对闰年规则有点困惑?

从您的链接:

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

所以能被400整除的年份就是闰年。您的代码中的条件是相反的。

于 2013-02-02T22:27:34.497 回答