1064:日历问题

问题 F: 日历问题

时间限制: 10 Sec   内存限制: 128 MB
提交: 766   解决: 412
[ 提交][ 状态][ 讨论版]

题目描述

在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。

输入

输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。

输出

对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday“。

样例输入

1730
1740
1750
1751
-1

样例输出

2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday

2004-10-17 Sunday

问题分析

开始的日期是2000年1月1日,查阅资料得知当天是Saturday。那么开工吧!

求星期几是显而易见的,求余即可。

关键是输出年月日。

输入的是从那天开始逝去的天数,假设为days,只要days!=-1,就进行循环。

循环当中首先求年份。只要days还大于365或者366,就进行减法运算,days-=365或者366,这个数字需要判断闰年与否。这里还是挺巧妙的,等会儿看具体代码。

剩下的日子就小于一年了,同理,每次减去月份的天数,直到小于当月天数,最后剩下的日子就和日期相差无几了。

如何判断当月天数和当年是否是闰年呢?提前创建好数组,分别存放各自的天数,再在year[]、month[]的方括号里进行闰年的判断,就差不多啦。

最后输出的天数,加一减一的,可以代入特殊值验证一下,比如days=1,是2000年1月2日 星期天,日期加了一。

那么代码:

#include <iostream>
#include <iomanip>
using namespace std;
int leap(int);
char weekday[7][10] = { "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };//已知2000年1月1日是星期六  一定要细心别拼错了,一开始就把Wednesday拼错了,提交出错总是查不到原因……
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 };//分别是平年的月份天数和闰年的月份天数。耐心、细心!注意和year顺序对应
int main(){
	int days=0, dayofweek;
	int i = 0, j = 0;
	while (days != -1){
		cin >> days;
		if (days == -1) break;
		dayofweek = days % 7;// 取模得到星期几
		for (i = 2000; days >= year[leap(i)]; i++){//核能预警,非战斗人员迅速撤退……如果天数大于一年的天数就减去一年,直到小于365或366
			days -= year[leap(i)];
		}
		for (j = 0; days >= month[leap(i)][j]; j++)//与上面同理,减掉每个月的天数,直到小于当月天数
		{
			days -= month[leap(i)][j];
		}
		cout << i << "-" <<setfill('0')<< setw(2)<<j + 1 << "-" <<setfill('0')<<setw(2)<< days + 1 << " " << weekday[dayofweek] << endl;//按照格式输出,注意月份+1(因为j从0开始),天数+1,可以自己代入特殊值推算一下
	}//注意输出样例的09,06,需要设置域宽并填充0.这个方法是百度来的,记住就好。头文件iomanip.h
	system("pause");
	return 0;
}
int leap(int i){                      //判断闰年与否,注意和year对应
	if ((i % 4 != 0) ||( i % 100 ==0 && i % 400 != 0))  return 0;//0是平年
	else return 1;//1是闰年
}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值