公開日 :
更新日 :

yyyy 年 mm 年 dd 日 から d 日後の日付を配列で返す

#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using P = pair<int, int>;
#define rep(i, n) for(int i = 0; i < (n); ++i)
// using mint = modint998244353;
// using mint = modint1000000007;
// const int mod = 1000000007;
// const ll INF = 1LL << 62;
// const int INF = 1001001001;

// うるう年か否かを返す
bool isLeapYear(int yyyy) {
  if(yyyy % 4 == 0) {
    if(yyyy % 100 == 0) {
      if(yyyy % 400 == 0) {
        return true;
      } else {
        return false;
      }
    } else {
      return true;
    }
  } else {
    return false;
  }
  return false;
}

// yyyy 年 mm 年 dd 日 から d 日後の日付を配列で返す
vector<int> advanceDate(int yyyy, int mm, int dd, int d) {
  while(0 < d) {
    dd++;
    int limit = 31;
    if(mm == 2) {
      if(isLeapYear(yyyy) == true) {
        limit = 29;
      } else {
        limit = 28;
      }
    } else if(mm == 4 || mm == 6 || mm == 9 || mm == 11) {
      limit = 30;
    }
    if(limit < dd) {
      dd = 1;
      mm++;
    }
    if (12 < mm) {
      yyyy++;
      mm = 1;
    }
    d--;
  }
  vector<int> res = {yyyy, mm, dd};
  return res;
}

int main() {
  int yyyy = 2024;
  int mm = 2;
  int dd = 14;

  // 2024年2月14日から20日後の日付(初日は含まない)を取得
  vector<int> res = advanceDate(yyyy, mm, dd, 20);

  yyyy = res[0];
  mm = res[1];
  dd = res[2];

  cout << yyyy << "/" << mm << "/" << dd << endl; // 2024/3/5
  return 0;
}