数据结构练习 - T003
计算今天是星期几
输入今天的年份,月份和日期,输出今天是周几?
输入 :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} \rfloor - \lfloor \frac{y-1}{100} \rfloor + \lfloor \frac{y-1}{400} \rfloor\)。
平年 365天对 7的余数为 1,闰年 366天对 7的余数为 0,则从0000年到去年的天数对7的余数为\(y' = y-1 + \lfloor \frac{y-1}{4} \rfloor - \lfloor \frac{y-1}{100} \rfloor + \lfloor \frac{y-1}{400} \rfloor\);
再计算出今年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\n", dd);
return 0;
}