闰年的两种情况:
能被 4 整除但不能被 100 整除
能被 400 整除,也就是常说的四年一闰,百年不闰,四百年再闰
天数问题:2011 年 11 月 11 日是星期 5
首先算年份差所带来的天数差
给出的年份比基础年份小或者就是 2011 年,比如 2009 年,我们首先计算 2009 年 1 月 1 日到 2011 年 1 月 1 日的天数,闰年 366 天,非闰年 365 天,2009 年开始,算完 2010 年结束。
给出的年份比基础年份大,比如 2013 年,当然就是从 2011 年开始,算完 2012 年结束
经过这个步骤,得到 day1
然后算由于月份和天的差所带来的天数差
首先当然是计算 1 月 1 日到给定的日期(比如 3 月 8 号)的天数,计算的时候是用循环,从 1 月开始加,加完 2 月结束,最后再加上 8 天,但是注意,你此时算出的天数多了 1,举个例子,1 月 1 日到 1 月 3 日有几天?当然是 2 天,这要比 3 多 1 天,因为起始点就是 1 了,明白了这个,我们就可以用得出的天数减 1,从而获得了第二个天数 day2
关键时刻,计算真实的天数差
如果给出的年份小于等于基础年份,那么我们得到的 day1 实际上是算多了,而且正好多出了 day2 天,所以真正的天数差是 day1 — day2
如果给出的年份大于基础年份,那么天数实际上是算少了,少了 day2 天,所以真正的天数是 day1 + day2
在得出天数之后,我们还要分情况,首先将得到的天数差 day % 7,得到星期差
如果给出的年份小于等于基础年份,那么应该从基础时间(星期六)向负方向数 day % 7 天,注意 1 之后要变成 7
如果给出的年份大于基础年份,那么应该从基础时间(星期六)向正方向数 day % 7 天,注意 7 之后要变成 1
#include <cmath>
#include <iostream>
using namespace std;
bool leap(int year) //判断是否闰年
{
if (year % 4 == 0 && year % 100 != 0)
return true;
if (year % 400 == 0)
return true;
return false;
}
int getYD(int year) // day1
{
int sum = 0;
int i;
if (year <= 2011) {
for (i = year; i < 2011; i++) {
if (leap(i))
sum += 366;
else
sum += 365;
}
}
if (year > 2011) {
for (i = 2011; i < year; i++) {
if (leap(i))
sum += 366;
else
sum += 365;
}
}
return sum;
}
int getMD(int year, int mon, int day) // day2
{
int i;
int sum = 0;
for (i = 1; i < mon; i++) {
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 ||
i == 12)
sum += 31;
if (i == 4 || i == 6 || i == 9 || i == 11)
sum += 30;
if (i == 2 && leap(year))
sum += 29;
if (i == 2 && !leap(year))
sum += 28;
}
sum = sum + day - 1;
return sum;
}
int main() {
int year, mon, day, sum;
while (cin >> year >> mon >> day) {
sum = getYD(year);
if (year < 2011) {
sum = sum - getMD(year, mon, day);
cout << (sum % 7 == 6 ? 7 : abs(6 - (sum % 7))) << endl;
} else {
sum = sum + getMD(year, mon, day);
cout << ((6 + (sum % 7)) > 7 ? ((6 + (sum % 7)) % 7)
: (6 + (sum % 7)))
<< endl;
}
}
return 0;
}