项目Euler 19中的错误1错误

时间:2013-02-02 22:00:46

标签: c++ math

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

我注意到1901年1月/ 2月1日不是星期日,也不是2001年1月/ 2月1日,因此我可以将我的日历年视为从3月1日开始。使用基本模块化算法,很容易看出,如果闰年没有'如果存在,那么给定年份中的Xday数是重复序列{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);

1 个答案:

答案 0 :(得分:1)

编辑:关于闰年规则。

闰年规则只有一个更特殊的情况。

如果是以下年份是闰年:

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

有时我希望我们有公制日历。毫秒和千秒,任何人?


也许你对闰年规则感到有些困惑?

从您的链接:

  

闰年发生在任何一年,可以被4整除,但除非可以被400整除,否则不会在一个世纪。

所以可以被400 整除的一年是闰年。你的代码中的条件是相反的。