题目描述
We now use the Gregorian style of dating in Russia. The leap years are years with number divisible by 4 but not divisible by 100, or divisible by 400.
For example, years 2004, 2180 and 2400 are leap. Years 2004, 2181 and 2300 are not leap.
Your task is to write a program which will compute the day of week corresponding to a given date in the nearest past or in the future using today’s agreement about dating.
输入
There is one single line contains the day number d, month name M and year number y(1000≤y≤3000). The month name is the corresponding English name starting from the capital letter.
输出
Output a single line with the English name of the day of week corresponding to the date, starting from the capital letter. All other letters must be in lower case.
样例输入
21 December 2012
5 January 2013
样例输出
Friday
Saturday
思路:从1年1月1日(星期一)开始累计。先遍历到目标年份的前一年(这样做会更快)。最后将得到的天数取7的余数,再代入WeekDay数组即可。
#include<cstdio>
#include<cstring>
//余1是Monday,余0是Sunday
char WeekDay[7][10]={"Sunday","Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday"};
//用数组元素序号1到12表示1月到12月
char M[13][10]={"0","January", "February","March","April","May","June",
"July","August","September","October","November","December"};
//考虑闰年时的每月天数
int MonthDay[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
//判断是否为闰年
int isLeap(int year) {
int isLeap = 0;
if ((year % 4 == 0 && year % 100) || (year % 400) == 0) {
isLeap = 1;
}
return isLeap;
}
int main() {
int day, year;
char month[10];
while (scanf("%d %s %d", &day, month, &year) != EOF) {
int i;
int Month = 0;
//将月份数从char(month)转换为int(Month)
for (i = 1; i <= 12; i++) {
if (strcmp(M[i], month) == 0) {
Month = i;
break;
}
}
//累加到目标日期前一年
int sum = 0;
for (i = 1; i < year; i++) {
int leap = isLeap(i);
if (leap == 1) {
sum += 366;
} else {
sum += 365;
}
}
//比对月和日
int m1 = 1, d1 = 1;
while (i < year || m1 < Month || d1 < day) {
d1++;
if (d1 == MonthDay[m1][isLeap(i)] + 1) {
m1++;
d1 = 1;
}
if (m1 == 13) {
i++;
m1 = 1;
}
sum++;
}
sum++;//从1号到2号有两天
int cnt = sum % 7;
printf("%s\n", WeekDay[cnt]);
}
return 0;
}