-
描述
-
在我们现在使用的日历中, 闰年被定义为能被 4 整除的年份,但是能被 100 整除而
不能被 400 整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰
年,而 1600, 2000 和 2400 是闰年。 给定从公元 2000 年 1 月 1 日开始逝去的天数,你
的任务是给出这一天是哪年哪月哪日星期几。
输入
-
输入包含若干行,每行包含一个正整数,表示从 2000 年 1 月 1 日开始逝去的天数。
输入最后一行是−1, 不必处理。可以假设结果的年份不会超过 9999.
输出
-
样例输入
-
1730 1740 1750 1751 -1
样例输出
-
2004-09-26 Sunday 2004-10-06 Wednesday 2004-10-16 Saturday 2004-10-17 Sunday
来源
-
Shanghai 2004 Preliminary
解题思路
这道题目使用的背景知识是闰年的定义和公历日历中一年 12 个月中每个月的日期数。根据题目要求,所有涉及的数值都是用整数可以表示的。这个问题可以分解成两个彼此独立的问题:一个是要求的那天是星期几,另一是要求的那天是哪年哪月那天。第一个问题比较简单,知道 2000 年 1 月 1 日是星期几后,只要用给定的日期对 7 取模,就可以知道要求的一天是星期几。第二个问题相对麻烦一些。我们用 year, month, date 分别表示要求的日期的年、月、日。当输入一个整数 n 时,如果 n 大于等于一年的天数,就用 n 减去一年的天数,直到 n 比一年的天数少(这时假设剩下天数为 m),一共减去多少年 year 就等于多少;如果 m 大于等于一个月的天数,就用 m 减去一个月的天数,直到 m 比一个月的天数少(这时假设剩下的天数为 k),一共减去多少个月 month 就等于多少;这时 k 为从当月开始逝去的天数,k+1 就是要求的 date。这里减去一年的天数时要判断当年是否是闰年,减去一月时要判断当月有几天。
示例代码:
#include "stdio.h"
char week[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
int year[2]={365,366};
int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};
int type(int m)
{
//判断第m年是否是闰年,是则返回1,否则返回0
if (m % 4 != 0 || (m % 100 == 0 && m % 400 != 0))
return 0;
else return 1;
}
int main(int argc, char const *argv[])
{
int days,dayofweek;//days表示输入的天数,dayofweek表示星期几
int i = 0,j = 0;
while(scanf("%d",&days) && days != -1)
{
dayofweek = days % 7;
for(i = 2000;days >= year[type(i)]; i++)
days -= year[type(i)];
for(j = 0;days >= month[type(i)][j]; j++)
days -= month[type(i)][j];
printf("%d-%02d-%02d %s\n",i,j+1,days+1,week[dayofweek] );
}
return 0;
}