题目
思路
如果给定一个天数n,让我们确定它是2000年1月1日后的什么时间,那么我们应该是逐年计算,确定在哪一年后再逐月计算再确定天数即可。但是注意这个题目的描述,是从2000年1月1日开始记的,那么说明n=1的时候,应该是2000年1月2日周天。所以在计算完星期后,要将n++。因为星期是要累加的,而日子是直接计算出来的。
AC代码
#include <bits/stdc++.h>
using namespace std;
map<int, string> m1 = {
{1, "Monday"},
{2, "Tuesday"},
{3, "Wednesday"},
{4, "Thursday"},
{5, "Friday"},
{6, "Saturday"},
{7, "Sunday"},
};
bool is_leap(int n) {
if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) {
return true;
} else {
return false;
}
}
int day_of_year(int n) {
if (is_leap(n))
return 366;
else
return 365;
}
int day_of_month(int year, int n) {
if (n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 || n == 12)
return 31;
if (n == 2) {
if (is_leap(year))
return 29;
else
return 28;
} else
return 30;
}
int main() {
int n;
string Weekday;
while (scanf("%d", &n), n != -1) {
int day = n % 7 + 6;
day = (day <= 7) ? day : day - 7;
n++;
int year = 2000;
Weekday = m1[day];//星期数
int remain_day = n;
while (remain_day > 0) {
remain_day -= day_of_year(year++);
}
//跳出来后remain_day是小于0的
year -= 1;
remain_day += day_of_year(year);
int month = 1;
while (remain_day > 0) {
remain_day -= day_of_month(year, month++);
}
month--;
remain_day += day_of_month(year, month);
string date = to_string(remain_day);
string date1 = to_string(month);
if (month < 10) {
date1 = '0' + date1;
}
if (remain_day < 10) {
date = '0' + date;
}
cout << year << "-" << date1 << "-" << date << " " << Weekday << endl;
}
}