L2-000 日历

题解

  这一题,乍一看,很简单,初始时我也这么以为,模拟了一下结果TLE了,后来再把天数减到小于一年时,又Error了。

       后来重新做了一下,估计是,闰年的状态使用了上一次的结果导致,其实直接对第二月赋值即可,真是想多了啊/(ㄒoㄒ)/~~。

#include <iostream>
using namespace std;

int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string week[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int r;
int y = 2020, m = 1, d = 1, w = 5; 

int isleap(int x)
{
    return x % 4 == 0 && x % 100 != 0 || x % 400 == 0;
}

void caltime(int r)
{
    while (r--) {
        if (d == month[m]) {
            if (m == 12) {
                ++y;
                if (isleap(y)) month[2] = 29;
                else month[2] = 28;
                m = 1;
            }
            else {
                ++m;
            }
            d = 1;
        }
        else {
            ++d;
        }
        ++w;
        if (w == 7) w = 0;
    }
    cout << y << '-';
    if (m < 10) cout << 0 << m;
    else cout << m;
    cout << '-';
    if (d < 10) cout << 0 << d;
    else cout << d;
    cout << " ";
    cout << week[w] << endl;
}

int main()
{
    cin >> r;
    while (r != -1) {
        y = 2000, m = 1, d = 1, w = 5;
        int ys = 366; // 初始 2000 
        while (ys <= r) {
            w = (w + ys) % 7;
            r -= ys;
            ++y;
            if (isleap(y)) ys = 366;
            else ys = 365;
        }
        if (isleap(y)) month[2] = 29;
        else month[2] = 28;
        caltime(r);
        cin >> r;
    }
    return 0;
}

 

posted @ 2020-10-25 21:43  Fool_one  阅读(99)  评论(0编辑  收藏  举报