日曆是用於表述時間的系統,從小時到分鐘,從月到日,最後從年份到世紀。術語小時、 日、月、年、世紀都是日曆系統表述時間的單位。 按照目前國內使用的陽曆,閏年被定義爲能被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;
}