PTA 日历

日历是用于表述时间的系统,从小时到分钟,从月到日,最后从年份到世纪。术语小时、 日、月、年、世纪都是日历系统表述时间的单位。 按照目前国内使用的阳历,闰年被定义为能被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” 或 “Saturday”。

输入样例:
1629
1345
1001
1876
-1
输出样例:
2004-06-17 Thursday
2003-09-07 Sunday
2002-09-28 Saturday
2005-02-19 Saturday

#include <iostream>
#include <iomanip>
using namespace std;
int y = 2000, m = 0, d = 1, w = 0, t1 = 0, t2 = 0, days = 1, i = 0;
string week;
int mon1[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int mon2[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
int main() {
	while (cin >> days && days != -1) {
		t1 = days;
		for (int i = 1;;i++) {
			if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
				t1 -= 366;
				if (t1 < 0) {
					t1 += 366;break;
				}
				y++;
				if (y > 9999)exit(0);
			}
			else
				{
				t1 -= 365;
				if (t1 < 0) {
					t1 += 365;break;
				}
				y++;
				if (y > 9999)exit(0);
				}
		}
		t2 = t1;
		if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
			for (i = 0;;i++) {
				if (t2 - mon2[i] < 0)break;
				t2 -= mon2[i];
			}
		else
			for (i = 0;;i++) {
				if (t2 - mon1[i] < 0)break;
				t2 -= mon1[i];
			}
		m = i + 1;
		d = t2 + 1;
		w = days % 7;
		switch (w) {
		case 1: week = "Sunday";break;
		case 2: week = "Monday";break;
		case 3: week = "Tuesday";break;
		case 4: week = "Wednesday";break;
		case 5: week = "Thursday";break;
		case 6: week = "Friday";break;
		case 0: week = "Saturday";break;
		}
		cout << y << '-';
		cout << setw(2) << setfill('0') << m << '-' << setw(2) << setfill('0') << d << ' ';
		cout << week << endl;
		y = 2000; m = 0; d = 1; w = 0; t1 = 0; t2 = 0; days = 1;
	}
	return 0;
}
发布了23 篇原创文章 · 获赞 31 · 访问量 1114

猜你喜欢

转载自blog.csdn.net/weixin_45333771/article/details/103277742
PTA