日历问题

描述
在我们现在使用的日历中, 闰年被定义为能被 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;
}	



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值