老生常谈的计算时间的题,我比较习惯设置一个二维数组和一个函数来区分闰年,然后两点,1是思路,采用的是将时间拨回到该年的1月1日0点0分0秒,然后再往后加,依次算出年月日时分秒,2是注意,月和日起始是从1开始的,它的1就相当于时分秒的0,是不起作用的(一开始不用加进去的),然后别的就没有需要注意的地方了,还是比较好写的题目
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
int a[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};
int judge(int x) {
if (x % 4 == 0 && x % 100) return 1;
else if (x % 400 == 0) return 1;
return 0;
}
int main() {
int t;
cin >> t;
while (t--) {
ll w;
int year, month, day, hour, minute, second;
cin >> w >> year >> month >> day >> hour >> minute >> second;
w = (1 << (w - 1)) - 1;
w += second + minute * 60 + hour * 3600 + (day - 1) * 3600 * 24;
day = hour = minute = second = 0;
for (int i = 1; i < month; i++) {
int flag = judge(year);
w += a[flag][i - 1] * 3600 * 24;
}
month = 0;
int temp[2] = {};
for (int i = 0; i < 12; i++) {
temp[0] += a[0][i] * 24 * 3600;
}
temp[1] = temp[0] + 24 * 3600;
while (1) {
int flag = judge(year);
if (w < temp[flag]) break;
w -= temp[flag];
year++;
}
int flag = judge(year);
while (1) {
if (w < a[flag][month] * 24 * 3600) break;
w -= a[flag][month] * 24 * 3600;
month++;
}
month++;
day = w / 24 / 3600 + 1;
w %= (24 * 3600);
hour = w / 3600;
w %= 3600;
minute = w / 60;
second = w % 60;
cout << year << " " << month << " " << day << " " << hour << " " << minute << " " << second << endl;
}
return 0;
}