计算今天是星期几
输入今天的年份,月份和日期,输出今天是周几?
输入 :y m d
输出:k
余数公式:
[(a_1 + a_2 + cdots + a_k) mathrm{mod} N =
(a_1 mathrm{mod} N + a_2 mathrm{mod} N + cdots + a_k mathrm{mod} N) mathrm{mod} N
]
闰年的判断:(满足以下其中条件即可)
- 年份能被4整除,但是不能被100整除(普通闰年)
- 年份能被400整除(世纪闰年)
从公元0000年开始算起到去年 y-1,闰年的个数有(lfloor frac{y-1}{4}
floor - lfloor frac{y-1}{100}
floor + lfloor frac{y-1}{400}
floor)。
平年 365天对 7的余数为 1,闰年 366天对 7的余数为 0,则从0000年到去年的天数对7的余数为(y' = y-1 + lfloor frac{y-1}{4}
floor - lfloor frac{y-1}{100}
floor + lfloor frac{y-1}{400}
floor);
再计算出今年1月到前月m-1的天数对7的余数(m')(注意闰年2月份天数+1);
最后计算得到结果: ((y' + m' + d) mathrm{mod} 7)
#include <bits/stdc++.h>
using namespace std;
/*
余数公式:
(a1+a2+a3+...+ak) mod N = (a1 mod N + a2 mod N + a3 mod N +...+ ak mod N ) mod N
*/
int main()
{
int y, m, d;
int dy, dm, dd;
int sum;
int months[12] = {31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};
scanf("%d%d%d", &y, &m, &d);
// 计算从去年 y-1到 0000年对 7的余数,
// 平年 365天对 7的余数为 1,
// 闰年 366天对 7的余数为 0,
// 闰年是指满足以下其中一个条件的年份:
// 1. 能被4整除但不能被400整除(普通闰年)
// 2. 能被400整除(世纪闰年)
dy = (y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400;
// 计算今年1月到 m-1月的总天数对 7 的余数
sum = 0;
for(int i = 1; i <= m - 1; ++i){
sum = sum + months[i-1];
}
dm = sum % 7;
// 闰年再加1天
if ( m>=2 && ((y%4==0 && y%100!=0) || (y%400==0))){
dm = (dm + 1) % 7;
}
// 天数差加起来再求余数
dd = (dy + dm + d) % 7;
printf("%d
", dd);
return 0;
}