我正在做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);