0
点赞
收藏
分享

微信扫一扫

P2655 2038年问题

罗蓁蓁 2022-01-13 阅读 12

老生常谈的计算时间的题,我比较习惯设置一个二维数组和一个函数来区分闰年,然后两点,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;
}
举报

相关推荐

0 条评论