问题 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 Saturday2004-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是闰年 }