前言
欧拉计划是学习数学、数论选手遨游的海洋,700+道题让你我越来越强。
打卡网址链接: link.
一 题目描述
题目链接:link.
二 题解分析
1.暴力求解(低配版解法)
可以这样思考,首先外层套一个1901年到2000年的循环,依次判断是否是闰年。
齐次开辟一个大小为12的数组存放非闰年的每个月天数,同时falg变量标记是否为闰年,作为二月份的加1操作。
s初始化为1,因为1901.1.1为星期一,s每次加当月天数,并且mod7,结果就是对应星期几,s=0为星期日。
2.蔡勒公式(公式法)
第一次听到蔡勒公式还是大一,呢个时候啥也不懂,参加了学校的一次编程比赛,遇到这种日期问题,我直接跳,(鄙人不才,不清楚每个月有多少天,hhh),赛后耿佬和我提到了蔡勒公式。
今天又偶然刷到这种题,还真是一种怀念。
百度百科链接:link.
我就简单写个公式,感兴趣的同学,上方链接寻求真理。
三 题解代码
注:罗马教皇决定在1582年10月4日后使用格利戈里历法;而英国则是在1752年9月3日后才接受使用格利戈里历法。
咱也不知道171还是172对。
// An highlighted block
#include <iostream>
using namespace std;
int flag=1;
int cl(int y, int m, int d){
if(m == 1 || m == 2){
y--;
m += 12;
}
int w;
if(y==1582&&m==9&&d==3) flag=0;
if(flag)
w = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)% 7;
else w = (d+2*m+3*(m+1)/5+y+y/4+5)% 7;
return w;
}
int main(){
int s = 0;
for(int y = 1901; y <= 2000; y++){
for(int m = 1; m <= 12; m++){
if(cl(y, m, 1) == 6){ s++;}
}
}
cout<<s;
return 0;
}