我在做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);
答案 0 :(得分:1)
编辑:关于闰年规则。
闰年规则只有一个更特殊的情况。
如果是以下年份是闰年:
有时我希望我们有公制日历。毫秒和千秒,任何人?
也许你对闰年规则感到有些困惑?
从您的链接:
闰年发生在任何一年,可以被4整除,但除非可以被400整除,否则不会在一个世纪。
所以可以被400 整除的一年是闰年。你的代码中的条件是相反的。