HDU-4515 미니 Q 시리즈 이야기 - 세계에서 가장 먼 거리 시뮬레이션

7276 단어 HDU
제목: 어느 날을 알려주고 앞과 뒤로 각각 일정 일수를 미루고 출력으로 계산한 날짜를 계산한다.
해법: 매일 시뮬레이션을 하는데, 날짜의 각 위치의 진법은 모두 같지 않다.
코드는 다음과 같습니다.
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

int month[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool leap(int y) {
    return (y%4==0 && y%100!=0) || (y%400==0);
}

int getdays(int y, int m) {
    if (leap(y) && m == 2) return 29;
    return month[m];
}

struct Data {
    int y, m, d;
    Data():y(2013),m(3),d(24){}
    const Data & sub(int days);
    const Data & add(int days);
    void show() const;
};

void Data::show() const {
    printf("%04d/%02d/%02d", y, m, d);    
}

const Data & Data::sub(int days) { //       
    while (days--) {
        d -= 1;
        if (d == 0) {
            d += getdays(y, m-1);
            m -= 1;
        }
        if (m == 0) {
            m = 12;
            y -= 1;
        }
    }
    return *this;
}

const Data & Data::add(int days) {
    while (days--) {
        d += 1;
        if (leap(y)&&m==2&&d==29) {}
        else if (d > month[m]) {
            d = 1;
            m += 1;
        }
        if (m == 13) {
            m = 1;
            y += 1;
        }
    }
    return *this;
}

int main() {
    int T, days;
    scanf("%d", &T);
    while (T--) { 
        Data m1, m2;
        scanf("%d", &days);
        m1.add(days).show();
        printf(" ");
        m2.sub(days).show();
        puts("");
    }
    return 0;    
}

좋은 웹페이지 즐겨찾기